在Python中绑定到Pig STORE或DUMP输出

时间:2012-01-12 23:53:25

标签: python apache-pig

我正在寻找编写可以对Pig作业输出起作用的python代码的“正确”方法。

这是我的情况。我写了一个Pig脚本来处理大量数据并输出一小组关系。输出数据量足够小,可以直接向控制台DUMP。 E.g:

grunt> DUMP results
(Control, column1, column2, column3, column4, column5, column6)
(Treatment1, column1, column2, column3, column4, column5, column6)
(Treatment2, column1, column2, column3, column4, column5, column6)
(Treatment3, column1, column2, column3, column4, column5, column6)
grunt>

下一步,我想对关系中的数字进行一些数字处理,例如:计算观察治疗结果显着性的p值。我真的很想使用Python:Pig本身显然不适用于那种任务,我宁愿不用Java重写现有的代码。所以我想做的是以某种方式从python绑定到STORE或DUMP命令的输出,并继续前进。我的问题是找出前进的最佳方法。以下是我可以看到的方式:

  1. 使用Python编写将执行计算的UDF。我可以做这个;实际上我的Pig脚本已经调用了几个Python UDF。但是,我的印象是,UDF打算一次处理一个关系/输入线,我需要从多个关系中获取数据以实现我的目标。我可以在UDF中间调用中混合某种状态存储,但它似乎不是正确的解决方案。
  2. 在Pig 0.9.1中通过Jython使用嵌入式Python。我对这种方法寄予厚望,但是从我在该功能上找到的有限文档来看,它似乎主要用于控制作业流程(规范示例是在迭代算法中检测收敛),而不是直接使用输出。具体来说,我看到了如何绑定到作业元数据的文档,比如它是成功还是失败,而不是如何绑定到输出。希望在这个问题上被证明是错误的。
  3. 让Python脚本调用Pig并将其传递给所需输出位置的本地或HDFS路径,等待作业完成,然后使用Python从该路径读入/解析关系。看起来真的很讨厌。
  4. 我缺少一个明显的选择,或者我对上述选项的理解存在很大差距?非常欢迎您的反馈!

1 个答案:

答案 0 :(得分:3)

我理解你对个人经历的挫败感。 #3实际上是一种非常合理的方法,但是,我建议略有不同。相反,使用bash脚本包装器来执行它们。这有一个很好的功能,你不必通过python进行所有笨拙的shell调用。

类似的东西:

pig mypigscript.pig ...
mkdir /tmp/pigout/
hadoop fs -get output/part* /tmp/pigout/
cat /tmp/pigout/* | python mypostprocessing.py

这种方法的好处是你可以真正了解参数,日志记录等。在生产中,我通常会将所有不同的阶段写入日志文件,检查错误输出的阶段等。

只是为了让您相信这是正确的方法 - 您不希望在reducer中对多个记录进行一点点处理。如果你有多个reducers并且由于你没有使用并行性而没有真正给你任何东西,这不起作用。我认为人们倾向于将过多的计算集中在Hadoop上,而不是在外面做一些简单明了的事情。