【Hive】array型(配列)へ変換

Hiveを使って、ある値をキーにして配列を作成したいときには、
以下の2つの方法があります。

COLLECT_LIST
COLLECT_SET

COLLECT_LIST

COLLECT_LISTは、ある値をキーとして配列を作成します。
早速例を見ていきましょう。


このようなテーブルがあったとします。

user_id animal
1 ぞう
1 きりん
1 ぞう
4 えび
4 さる
6 いぬ

user_idをキーとして、下記のようなテーブルを作りたいとします。

user_id animals
1 [ぞう,きりん,ぞう]
4 [えび,さる]
6 [いぬ]

その時のHiveクエリとしては、

SELECT
    user_id,
    COLLECT_LIST(animal) as animals
FROM
    table
GROUP BY
    user_id

COLLECT_SET

こちらはCOLLECT_LISTと少し異なります。
説明の前に具体例を見ていきましょう。


先ほどと同じテーブルを対象とします。

user_id animal
1 ぞう
1 きりん
1 ぞう
4 えび
4 さる
6 いぬ

このテーブルに対して、以下のクエリを実行します。
COLLECT_LISTのクエリとほぼ同じクエリですね。

SELECT
    user_id,
    COLLECT_SET(animal) as animals
FROM
    table
GROUP BY
    user_id

すると、結果は、、、、

user_id animals
1 [ぞう,きりん]
4 [えび,さる]
6 [いぬ]

user_id=1の結果が、COLLECT_LISTと異なりましたね。
なにが異なったのかというと、animalsカラムを見てください。
"ぞう"が2つから1になりました。

つまり、COLLECT_SETは配列に変換した値の中で重複が発生しません。

今までの結果をまとめると、

COLLECT_LIST:重複あり
COLLECT_SET :重複なし

このような違いがありますので、シーンによって使い分けてください。