25

特定のフィールドでグループ化し、グループ化されたフィールドで出力を取得したい。以下は、私が達成しようとしているものの例です:-

以下のように、2 つの列を持つ「sample_table」という名前のテーブルを想像してください。

F1  F2
001 111
001 222
001 123
002 222
002 333
003 555

以下の出力を与えるハイブクエリを書きたい:-

001 [111, 222, 123]
002 [222, 333]
003 [555]

Pig では、これは次のような方法で非常に簡単に実現できます。

grouped_relation = GROUP sample_table BY F1;

Hiveで簡単に行う方法があれば、誰かが提案できますか? 私が考えることができるのは、このためにユーザー定義関数 (UDF) を作成することですが、これは非常に時間のかかるオプションになる可能性があります。

4

2 に答える 2

34

組み込みの集計関数collect_set( doumented here ) を使用すると、必要なものがほとんど得られます。それは実際にあなたの入力例で動作します:

SELECT F1, collect_set(F2)
FROM sample_table
GROUP BY F1

残念ながら、重複する要素も削除されますが、これは望ましい動作ではないと思います。存在するのは奇妙ですcollect_setが、重複を保持するバージョンはありません。他の誰かがどうやら同じことを考えていたようです。そこの一番上と2番目の答えが、必要なUDAFを提供するようです。

于 2013-05-08T19:23:45.880 に答える