对于 Apache Pig,如何在 python 中编写 Load UDF

Posted

技术标签:

【中文标题】对于 Apache Pig,如何在 python 中编写 Load UDF【英文标题】:For Apache Pig, how do I write a Load UDF in python 【发布时间】:2013-08-19 01:59:33 【问题描述】:

我想为 Apache Pig 编写一个 Python UDF 加载函数,这样我就可以在 Pig 脚本中按以下方式使用它:

register 'myudfs.py' using jython as myfuncs;
A = load 'data' using myfuncs.myLoader() as line;

Pig documentation 提供了一些用于编写 Load UDF 的详细信息在 Java 中,但不是在 Python 中。我已经设法用 Python 实现了非常有用的 Eval 函数,但是我找不到任何关于如何用这种语言编写 Load 函数的信息。

因为我已经在 Python 中实现了一些 Eval UDF,所以我想为我的所有 UDF 坚持使用这种语言。

【问题讨论】:

我刚刚发现this answer:根据@Ian_Stevens 的说法,Pig 的LoadFuncs 不能用Python 编写。这可以解释为什么文档对此如此沉默。但这是真的吗? 【参考方案1】:

是的,这是真的。您甚至可以查看来源进行验证。注意 JythonFunction 如何扩展 EvalFunc 而不是 LoadFunc

如果我需要使用 python 来处理加载文件,我会这样做:

register 'myudfs.py' using jython as myudfs ;

A = LOAD 'foo.bar' AS (total:chararray) ; 
B = FOREACH A GENERATE myudf.prepare_input(total) ;

模拟一个 sudo-LoadFunc。

【讨论】:

感谢您的回答。对JythonFunction 的引用非常清楚。 为您解决问题:我尝试了完全相同的方法。问题是我需要对 每个 输入文件的第一行进行特殊处理,并且全局行计数器会枚举 所有文件 中的所有行,所以在 foreach 我没有知道我是否在第一线的方法。这就是为什么我希望写一个真正的自定义LoadFunc 您将需要一个 Java UDF。它们写起来很痛苦,但我写的东西可能接近你想要的here。可以使用RANK 进行枚举。这和this question一样吗?

以上是关于对于 Apache Pig,如何在 python 中编写 Load UDF的主要内容,如果未能解决你的问题,请参考以下文章

Apache Pig - 如何维护一个分布式查找表以供我的 python UDF 访问?

如何从 Pig 中的 Python UDF 打印?

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

Apache PIG - 分组

使用 Apache Pig 从文本文件中获取备用行

Apache Pig - 错误 2118:对于输入字符串:“4f8:0:a111::add:9898”