こんにちは、今回はTreasure Dataでマスター形式で保持している列のデータをトランザクション形式に変換する処理について書いていきたいと思います。
具体的なイメージは以下のA表からB表への変換です。
id | 性別 | 年代 | 都道府県 |
001 | 男性 | 20代 | 東京 |
002 | 女性 | 10代 | 大阪 |
id | 属性名 | 値 |
001 | 性別 | 男性 |
001 | 年代 | 20代 |
001 | 都道府県 | 東京 |
002 | 性別 | 女性 |
002 | 年代 | 10代 |
002 | 都道府県 | 大阪 |
A表と同じ内容のテーブルを用意しました。
UNNESTを使った結合処理
prestoのUNNESTを使えば以下の画像のように、各列の値を行に展開することができるようになります。
UNNESTの中にある配列を、項目名として登録しておき、その後に実際の値を配列として登録しておきます。
実際の配列の中身を見てみましょう。
もともとのA表の行ごとに、属性項目と値を配列形式に変換して保持しているのがわかると思います。
これをCross Joinすることで、行に展開することができるのです。
参考SQL
以下に今回実際に利用したSQLを記述しておきます。
SELECT a.id, t.attr, t.value
FROM a_table a
CROSS JOIN unnest (
array['性別', '年代', '都道府県'],
array[sex, age, todofuken]
) t (attr, value)
-- SELECT array['性別', '年代', '都道府県'], array[sex, age, todofuken] FROM a_table
最後に
逆に縦(行)に展開されているデータを横(列)に変換する処理については「Treasure Dataでテーブルの縦横変換をやってみた。」でご紹介しているので、興味があれば御覧ください。
データ分析を行うために、元あるデータを様々な形に変換する必要があると思うので、少しでも参考になれば幸いです。
最後までご覧いただきありがとうございました!
コメント