0

我正在使用 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 包含 (date, vid) 的所有 vid。但是,分组显示其他 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),.............})})

转储的结果显示其中包含其他 uid 数据的袋组。它将所有 uid 中的整个 vid 包分组,但我只希望每个 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 的结果。

4

1 回答 1

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);
    }
}
于 2016-04-27T13:23:17.400 回答