我的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);
...
}
}
我希望得到与之前的"dump result2"相同的输出,但相反,我得到了这样的东西:
(2014/03/10 00:00:00,79.92.147.88)
只有前两个字段被占用了!
当我试图显示元组的大小时,程序说元组的大小是2 !
所以看起来filter函数并没有把整个元组作为输入。
为什么会这样?
谢谢你的帮助。
从输入元组(您将作为参数传递给UDF)获得您想要的结果中的列,然后将其添加到DataBag,然后从UDF返回此DataBag。这个UDF的输出是一个Bag,然后在您的pig脚本中将这个Bag平铺。