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 中读取一组元组

元组Tuple

Python按整数递归排列并返回一组元组

元组tuple

将项目添加到 Django 中的元组元组后是不是可以重新启动服务器?

Python 元组Ⅱ