DataFu BagGroup将在FOREACH范围内对所有行李进行分组,而不是分组。怎么修?

时间:2016-03-15 17:57:26

标签: apache-pig apache-datafu

我正在使用DataFu将我的包包包起来。具体如下:

pvlist_grp = GROUP pvlist by uid;
uid_vid_pv = FOREACH pvlist_grp {
                vids = FOREACH pvlist GENERATE date, vid;   
                GENERATE uid,
                vids as vid,
                BagGroup(pvlist.(date, uid, vid), pvlist.date) as grouped;
                }
uid_vid_pv: {uid: chararray,vid: {(date: chararray,vid: chararray)},grouped: {(group: chararray,{(date: chararray,uid: chararray,vid: chararray)})}}

当我转储前10个时,我会看到每个uid包含的所有视频(日期,视频)。但是,分组显示其他uid记录。例如:

(60,{(20160103,255),(20160103,255),(20160103,257),(20160103,255),(20160101,252)},{(20160103,{(20160103,21,18),(20160103,21,453),(20160103,21,452),(20160103,21,67),(20160103,21,18),(20160103,21,455),(20160103,21,43),(20160103,21,453),(20160103,21,16),(20160103,21,45),(20160103,21,18),(20160103,21,18),(20160103,21,67),(20160103,21,455),.............})})

转储结果显示baggroup中包含其他uid数据。它将来自所有uid的整个视频包分组,但我只是想要它。

想法结果应该是:

(60,{(20160103,255),(20160103,255),(20160103,257),(20160103,255),(20160101,252)},{(20160103,{(20160103,255),(20160103,255),(20160103,257),(20160103,255)}),(20160101,{(20160101,252)})})

任何帮助为什么?我正在使用猪1.2.0。

更新

看起来像BagGroup一样从内存中调用操作。因此,第一个uid BagGroup始终是正确的,然后它将袋子添加到以前处理过的一起操作。 IE浏览器。如果第一个记录是uid 21,则BagGroup将所有21个结果分组。接下来,如果第二个记录uid为60,那么BagGroup将同时输出21和60个结果。

1 个答案:

答案 0 :(得分:1)

我有完全相同的问题。为了解决这个问题,我不得不修改BagGroup UDF (ver.1.2.0)。在groups.clear();方法的开头添加exec可以解决此问题。

@SuppressWarnings("unchecked")
@Override
public DataBag exec(Tuple input) throws IOException {
    fieldNames = (List<String>)getInstanceProperties().get(FIELD_NAMES_PROPERTY);

    DataBag inputBag = (DataBag)input.get(0);   

    groups.clear();

    for (Tuple tuple : inputBag) {
        Tuple key = extractKey(tuple);
        addGroup(key, tuple);
    }
}