使用 Pig 和 Python

Posted

技术标签:

【中文标题】使用 Pig 和 Python【英文标题】:Using Pig and Python 【发布时间】:2011-07-08 09:21:10 【问题描述】:

如果这个问题措辞不当,我深表歉意:我正在着手进行一个大型机器学习项目,但我不喜欢用 Java 编程。我喜欢用 Python 编写程序。我听说过关于猪的好消息。我想知道是否有人可以向我澄清 Pig 与 Python 结合用于数学相关工作的用途。另外,如果我要编写“流式 python 代码”,Jython 会出现吗?如果它出现在图片中会更有效吗?

谢谢

P.S:出于几个原因,我不喜欢按原样使用 Mahout 的代码。我可能想使用他们的一些数据结构:知道是否可以这样做会很有用。

【问题讨论】:

【参考方案1】:

将 Python 与 Hadoop 结合使用的另一个选项是 PyCascading。您可以在 Python/Jython 中仅编写 UDF 或使用流式传输,而不是将整个作业放在一起,在定义数据处理管道的同一脚本中使用 Python 函数作为“UDF”。 Jython 用作 Python 解释器,流操作的 MapReduce 框架为Cascading。连接、分组等在本质上与 Pig 类似,因此如果您已经了解 Pig,也就不足为奇了。

字数统计示例如下所示:

@map(produces=['word'])
def split_words(tuple):
    # This is called for each line of text
    for word in tuple.get(1).split():
        yield [word]

def main():
    flow = Flow()
    input = flow.source(Hfs(TextLine(), 'input.txt'))
    output = flow.tsv_sink('output')

    # This is the processing pipeline
    input | split_words | GroupBy('word') | Count() | output

    flow.run()

【讨论】:

如果你能更详细地解释代码 sn-p 那就太好了,谢谢!!!【参考方案2】:

当你使用streaming in pig 时,你使用什么语言并不重要......它所做的只是在shell 中执行一个命令(比如通过bash)。您可以使用 Python,就像您可以使用 grep 或 C 程序一样。

您现在可以定义Pig UDFs in Python natively。这些 UDF 在执行时将通过 Jython 调用。

【讨论】:

这两种方法有什么优缺点吗? (除了我必须忍受的 Jython 和 cPython 之间的明显差异之外......) 我不认为你会注意到任何一个显着的放缓。 除了速度之外,这两种方式会不会有设计上的限制?【参考方案3】:

Programming Pig 书中讨论了使用 UDF。一般来说,这本书是不可或缺的。在最近的一个项目中,我们使用了 Python UDF,并且偶尔会遇到浮点数与双精度数不匹配的问题,因此请注意。我的印象是,对 Python UDF 的支持可能不如对 Java UDF 的支持那么稳固,但总的来说,它运行得很好。

【讨论】:

我简要阅读了书中关于 UDF 的部分:我不太清楚一些事情:如果可以执行 Python/ 并嵌入所需的任何库,为什么还要使用 UDF代码的一部分?抱歉,如果这个问题有一个非常明显的问题,但我还没有真正看过流媒体。

以上是关于使用 Pig 和 Python的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中使用 Python UDF 时,如何让 Hadoop 查找导入的 Python 模块?

如何在 Amazon EMR 上的 pig 中使用 Python 流 UDF

PIG UDF (Python) 字符集编码

在 pig 中进行标记(使用 python udf)

在 Amazon EMR 上为 Pig UDF 加载外部 python 模块

如何从 Pig 中的 Python UDF 打印?