web-dev-qa-db-ja.com

演算子でHiveグループから要素の配列/バッグを取得する方法は?

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

次のように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)を書くことですが、これは非常に時間がかかるオプションかもしれません。

16
Anuroop

組み込みの集約関数collect_setここで省略 )を使用すると、ほぼ必要なものが得られます。それはあなたのサンプル入力で実際に動作します:

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

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

25
Daniel Koverman

定義によるセットは明確に定義されたdistinctオブジェクトのコレクションであるため、collect_setは実際には期待どおりに機能します。つまり、オブジェクトはセット内で1回だけ発生するか、まったく発生しません。

0
ellaqezi