我正在寻找编写可以对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命令的输出,并继续前进。我的问题是找出前进的最佳方法。以下是我可以看到的方式:
我缺少一个明显的选择,或者我对上述选项的理解存在很大差距?非常欢迎您的反馈!
答案 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上,而不是在外面做一些简单明了的事情。