特定のフィールドでグループ化し、グループ化されたフィールドで出力を取得したい。以下は私が達成しようとしていることの例です:-
次のように2つの列を持つ「sample_table」という名前のテーブルを想像してください。
F1 F2
001 111
001 222
001 123
002 222
002 333
003 555
以下の出力を提供するHiveクエリを記述したいと思います。
001 [111, 222, 123]
002 [222, 333]
003 [555]
Pigでは、これは次のような方法で非常に簡単に実現できます。
grouped_relation = GROUP sample_table BY F1;
Hiveでこれを行う簡単な方法があるかどうか誰かが提案できますか?私が考えることができるのはこれのためにユーザー定義関数(UDF)を書くことですが、これは非常に時間がかかるオプションかもしれません。
組み込みの集約関数collect_set
( ここで省略 )を使用すると、ほぼ必要なものが得られます。それはあなたのサンプル入力で実際に動作します:
SELECT F1, collect_set(F2)
FROM sample_table
GROUP BY F1
残念ながら、これは重複する要素も削除しますが、これは望ましい動作ではないと思います。 collect_set
は存在しますが、重複を保持するバージョンがありません。 他の誰かが明らかに同じことを考えている 。一番上と2番目の答えが必要なUDAFになるようです。
定義によるセットは明確に定義されたdistinctオブジェクトのコレクションであるため、collect_setは実際には期待どおりに機能します。つまり、オブジェクトはセット内で1回だけ発生するか、まったく発生しません。