对于 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 访问?