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 和用户定义函数的主要内容,如果未能解决你的问题,请参考以下文章