Skip to main content
 首页 » 编程设计

python之在 Python 中绑定(bind)到 Pig STORE 或 DUMP 输出

2024年08月30日26sharpest

我正在寻找“正确”的方式来编写可以处理 Pig 作业输出的 python 代码。

这是我的情况。我写了一个 Pig 脚本来处理大量数据并输出一小组关系。输出数据量小到可以直接DUMPed到控制台。例如:

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-vals。我真的很想为此使用 Python:Pig 本身显然不适合此类任务,我更愿意不使用 Java 重写现有代码。所以我想做的是以某种方式绑定(bind)到来自 python 的 STORE 或 DUMP 命令的输出,然后继续。我的问题是找出前进的最佳方式。以下是我可以看到的方式:

  1. 使用 Python 编写将执行计算的 UDF。我可以做这个;事实上,我的 Pig 脚本已经调用了几个 Python UDF。然而,我的印象是 UDF 旨在一次处理一个关系/输入行,我需要从多个关系中获取数据才能实现我的目标。我可以在调用之间的 UDF 中组合某种状态存储,但这似乎不是正确的解决方案。
  2. 在 Pig 0.9.1 中通过 Jython 使用嵌入式 Python。我对这种方法寄予厚望,但从我找到的有关该功能的有限文档来看,它似乎主要用于控制作业流程(典型示例是检测交互式算法中的收敛),而不是直接处理输出。具体来说,我看到了有关如何绑定(bind)到作业元数据(例如它是成功还是失败)的文档,但没有看到如何绑定(bind)到输出的文档。希望在这一点上被证明是错误的。
  3. 让 Python 脚本调用 Pig 并将所需输出位置的本地或 HDFS 路径传递给它,等待作业完成,然后使用 Python 从该路径读取/解析关系。看起来真的很老套。

我是否遗漏了一个明显的选项,或者我对上述选项的理解存在很大差距?非常欢迎您的反馈!

请您参考如下方法:

我从个人经历中理解您的沮丧。 #3 实际上是一种非常合理的方法,但是,我建议略有不同。相反,使用 bash 脚本包装器来执行两者。这有一个很好的特性,您不必通过 python 执行所有笨拙的 shell 调用。

类似于:

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

这种方法的好处是您可以非常喜欢参数、日志记录等。在生产中,我通常将所有不同的阶段写入日志文件,检查阶段是否出错,等等。

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