hive
hiveql

Hive 複数要素を展開して、複数行にする(LATERAL VIEW/split/explode)

内容

1.したいこと
2.クエリと解説
2_1.split()の挙動
2_2.explode()の挙動

1.したいこと

usr item_list
A aaa,bb,c
B a,bb
C ss

ユーザごとに購入したアイテムが入っているテーブル(テーブル名はdataとする)は、
item_listの1カラムにitemがたくさん入っている構造だが、これを
以下のtemカラムのように1行1アイテムの構造にしたい。

usr item_list
A aaa
A bb
A c
B a
B bb
C ss

2.クエリと解説

SELECT
        usr,
        item
FROM
        data
LATERAL VIEW
        explode( split( item_list, ',' ) ) item_list2 as item

上記のように
item_listカラムを、
①split()で1アイテムずつに分割する。
②explode()で1カラムにする。
③LATERAL VIEW でビューにして、元のdataテーブルの横につけている。
という順番で作成できるが、以下で①、②、③の挙動を見る。

2_1.split()の挙動

split()で1アイテムずつに分割する

--item_listを、カンマが出てきたら分割
SELECT
        split(item_list, ',') as item
FROM
        data

結果

item_list
["aaa"],["bb"],["c"]
["a"],["bb"]
["ss"]

カンマが出てきたときに分割されていることが確認できました。
ここでの重要なポイントは、配列になっているということです。
2_2.で行う、explode()を使用するためには、配列にしておく必要があります。

2_2.explode()の挙動

explode()で1アイテム1行にする

SELECT
        explode(split(item_list, ',')) as item
FROM
        data

結果

item_list
aaa
bb
c
a
bb
ss

itemごとに1行になっていることが確認できました。

2_3.LATERAL VIEW の挙動

LATERAL VIEWでVIEWを作る

以下のように、2_1,2_2で解説したものを、
LATERAL VIEWでVIEWにしてitemというカラムを作成し、
元のdataテーブルの横につけている。

SELECT
        usr,
        item
FROM
        data
LATERAL VIEW
        explode( split( item_list, ',' ) ) item_list2 as item

結果

usr item_list
A aaa
A bb
A c
B a
B bb
C ss

完成。