DataFu BagGroup 将所有包分组,而不是在 FOREACH 范围内分组。怎么修?
DataFu BagGroup will group all the bags instead of group at the FOREACH scope. How to fix?
我正在使用 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) 的所有视频。但是,分组显示其他 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的结果。
我遇到了完全相同的问题。为了解决它,我不得不修改BagGroup UDF (ver.1.2.0)
。在 exec
方法的开头添加 groups.clear();
可解决此问题。
@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);
}
}
我正在使用 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) 的所有视频。但是,分组显示其他 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的结果。
我遇到了完全相同的问题。为了解决它,我不得不修改BagGroup UDF (ver.1.2.0)
。在 exec
方法的开头添加 groups.clear();
可解决此问题。
@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);
}
}