Apache Pig 和用户定义函数

Posted

技术标签:

【中文标题】Apache Pig 和用户定义函数【英文标题】:Apache Pig and User Defined Functions 【发布时间】:2015-06-30 13:29:01 【问题描述】:

我正在尝试使用 Apache Pig 读取日志文件。读入文件后,我想在 Python 中使用我自己的用户定义函数。我想要做的是类似于下面的代码,但它会导致错误 1066:无法打开别名 B 的迭代器,我无法通过 google 找到解决方案。

register 'userdef.py' using jython as parser;
A = LOAD 'test_data' using PigStorage() as (row);
B = FOREACH A GENERATE parser.split(A.row);
DUMP B;

但是,如果我将 A.row 替换为空字符串 '',则函数调用完成并且不会发生错误(但数据也未传递或处理)。

将数据行以字符串格式传递给 UDF 的正确方法是什么?

【问题讨论】:

对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。 【参考方案1】:

您不需要指定 A.row,单独的 row 或 $0 应该可以工作。 $0 是第一列,$1 是第二列。

请注意,如果 PigStorage 发现任何分隔符,它会自动拆分您的数据,因此行可能只是每行的第一个元素。

安东尼。

【讨论】:

谢谢,我能够让它工作为:register 'userdef.py' using jython as parser; A = LOAD 'test_data' using PigStorage() as (row:chararray); B = FOREACH A GENERATE parser.split(row); DUMP B; 但是,我不能以任何方式操作传递的数据,否则它会中断。如果我只返回传入的内容,它运行良好。有什么想法吗? 我不知道我是否真的明白你的意思,你应该显示输出。也许,您的 UDF 返回一个元组,然后您将其展平。 实际上,我需要将传入的值转换为字符串或将其转换为数组,然后才能对其进行操作。不太清楚为什么,但它似乎有效。

以上是关于Apache Pig 和用户定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Pig用户自定义函数(UDF)转

Pig Latin 中的用户定义函数

MAX(Count) 函数 apache pig latin

如何从 Pig 中的 Python UDF 打印?

Pig系统分析-Pig可扩展性

无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表