Pig - FilterFunc 不采用整个元组
Posted
技术标签:
【中文标题】Pig - FilterFunc 不采用整个元组【英文标题】:Pig - FilterFunc don't take the entire tuples 【发布时间】:2014-03-20 16:47:06 【问题描述】:我的 Pig 的一个过滤函数有问题。
但首先,我会告诉你上下文。
A = LOAD 'pig/hado/start_extrait2.csv' USING PigStorage(';') as (DAT_START:chararray, COD_IPUSER:chararray, NDI_START:chararray);
hado_search_file = LOAD 'pig/hado/recherche_hado.csv' USING PigStorage(';') as (DATE_HADO:chararray, IP_RECHERCHEE:chararray);
result2 = JOIN hado_search_file by IP_RECHERCHEE LEFT OUTER, A by COD_IPUSER;
让我们尝试可视化“result2”变量:
describe result2;
hado_search_file::DATE_HADO: chararray,hado_search_file::IP_RECHERCHEE: chararray,A::COD_IPUSER: chararray,A::DAT_START: chararray,A::NDI_START: chararray
dump result2;
(2014/03/10 00:00:00,192.168.2.67,,,)
(2014/03/10 00:00:00,79.92.147.88,79.92.147.88,2014/03/10 00:00:00,0385578168)
(2014/03/10 00:00:00,79.92.147.88,79.92.147.88,2014/03/10 00:00:00,0385578168)
(2014/03/10 00:00:01,79.92.147.88,79.92.147.88,2014/03/10 00:00:00,0385578168)
(2014/03/10 00:00:01,79.92.147.88,79.92.147.88,2014/03/10 00:00:00,0385578168)
然后,我尝试使用 FilterFunc
flt = FILTER result2 BY dateInferiorOrNull();
代码的开头是:
public class dateInferiorOrNull extends FilterFunc
@Override
public Boolean exec(Tuple input) throws IOException
System.out.println(input);
...
我希望得到与我之前制作的“转储结果 2”相同的输出,但相反,我有这样的东西:
(2014/03/10 00:00:00,79.92.147.88)
只取了前两个字段!
当我尝试显示元组大小时,程序说元组的大小是 2 !
所以过滤器函数似乎没有将整个元组作为输入。
为什么会这样?
感谢您的帮助。
【问题讨论】:
这真的是您调用 UDF 的方式吗?flt = FILTER result2 BY dateInferiorOrNull();
?
试试这个flt = FILTER result2 BY dateInferiorOrNull(*);
就是这样。我没有放 * 但我写的是字段名称。谢谢
【参考方案1】:
从输入元组(您将作为参数传递给 UDF)获取结果中所需的列,然后将其添加到 DataBag,然后从 UDF 返回此 DataBag。此 UDF 的输出是一个 Bag,然后在您的 pig 脚本中展平此 Bag。
【讨论】:
以上是关于Pig - FilterFunc 不采用整个元组的主要内容,如果未能解决你的问题,请参考以下文章
使用 AliasableEvalFunc 并在 Java UDF 中读取一组元组