3

我正在生成一个“包”信息,其大小(包内的元组数)可能会有所不同。由此,我想动态提取第一个元素。我该怎么做呢?

4

3 回答 3

8

使用 DataFu UDF:FirstTupleFromBag ( http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/bags/FirstTupleFromBag.html )

于 2014-05-15T16:36:02.627 回答
4

根据文档,包是元组的集合,并且

可以通过名称 (bag.field_name) 或位置 (bag.$0) 来解除对包的引用。如果取消引用一组字段(bag.(name1, name2) 或 bag.($0, $1)),则表达式表示由指定字段组成的包。

但要小心,b.$0不会给你包中的第一个元组,因为包不是有序的!您将获得组成元组的第一个元素。

您需要将包转换为有序结构,或者更好地使用 UDF。您还应该不接受这个答案(所以我可以删除它)并接受 Guarev 的答案,他有一个指向 UDF 的链接。

于 2012-06-20T06:33:53.623 回答
1

如果包中元组的顺序对于获得“第一个”元组很重要(当然是!),那么您可以执行以下操作,在https://community.hortonworks.com/上有更详细的解释问题/22863/cant-we-filter-the-data-which-we-have-done-in-37-s.html#answer-22995

max_runs = FOREACH grp_data {
    inner_sorted = ORDER runs BY runs DESC;
    first_row = LIMIT inner_sorted 1;
    GENERATE first_row AS most_hits;
}
于 2016-03-15T03:12:06.140 回答