横持ちのテーブルを縦持ちに変換する
PrestoのUNNESTを利用した横縦変換 | 分析ノート
横持ちのテーブル(htable)
uid | c1 | c2 | c3 |
---|---|---|---|
101 | 11 | 12 | 13 |
102 | 21 | 22 | 23 |
縦持ちのテーブルに変換したい(vtable)
uid | key | value |
---|---|---|
101 | c1 | 11 |
101 | c2 | 12 |
101 | c3 | 13 |
102 | c1 | 21 |
102 | c2 | 22 |
102 | c3 | 23 |
UNIONを使う(シンプル)
カラムが増えると長くなる
UNNESTを使う
配列 → レコードに変換する
time_range |
---|
[“16:00-16:30”, “16:30-17:00”, “17:00-17:30”, “17:30-18:00”, “18:00-18:30”, “18:30-19:00”, “19:00-19:30”, “19:30-20:00”, “20:00-20:30”, “20:30-21:00”, “21:00-21:30”] |
⇒ 結果
time_range |
---|
16:00-16:30 |
16:30-17:00 |
17:00-17:30 |
17:30-18:00 |
18:00-18:30 |
18:30-19:00 |
19:00-19:30 |
19:30-20:00 |
20:00-20:30 |
20:30-21:00 |
21:00-21:30 |
配列の順番も合わせて別々のレコードに変換したい場合
WITH ORDINALITY
をつけると配列の順番を格納するカラムがUNNEST後のカラム構造の末尾に追加される
文字列から変換する
query |
---|
q=カラオケ&city=tokyo&open=true |
縦横変換
縦持ちのテーブル(vtable)
uid | key | value |
---|---|---|
101 | c1 | 11 |
101 | c2 | 12 |
101 | c3 | 13 |
102 | c1 | 21 |
102 | c2 | 22 |
102 | c3 | 23 |
横持ちのテーブルに変換したい(htable)
uid | c1 | c2 | c3 |
---|---|---|---|
101 | 11 | 12 | 13 |
102 | 21 | 22 | 23 |
MAP_AGGを使ってkeyとvalueの対応のmapを作成して各keyの値を取り出すやり方
Prestoでない場合は以下のような書き方ができる