内容
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.クエリと解説
.sql
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アイテムずつに分割する
.sql
--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行にする
.sql
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テーブルの横につけている。
.sql
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 |
完成。