Treasure Dataでテーブルの縦横変換をやってみた。

未分類

こんにちは、今回はTreasure Dataでトランザクション形式で保持しているデータを加工して、
各値を一つの項目にマスターの形式に変換する処理について書いていきたいと思います。

具体的なイメージは以下のA表からB表への変換です。

id属性名
001性別男性
001年代20代
001都道府県東京
002性別女性
002年代10代
002都道府県大阪
A表
id性別年代都道府県
001男性20代東京
002女性10代大阪
B表

Treasure Dataでは、Prestoの関数でMAP_AGG()という関数があります。

これを利用して、id単位で各属性と値のマッピングを対応データを作成することができます。

MAP_AGG()の活用例

以下のイメージが対応データのイメージです。

idごとに各属性が対応していることがわかると思います。

上記のデータを作成した上で、各属性の値を列として抽出すれば、B表が出来上がります。

以下に参考SQLとイメージ画像を載せておきます。

参考SQL

WITH tab1 AS(
SELECT '001' AS id, '性別' AS attr,'男性' AS value
UNION ALL
SELECT '001' AS id, '年代' AS attr,'20代' AS value
UNION ALL
SELECT '001' AS id, '都道府県' AS attr, '東京' AS value
UNION ALL
SELECT '002' AS id, '性別' AS attr,'女性' AS value
UNION ALL
SELECT '002' AS id, '年代' AS attr,'10代' AS value
UNION ALL
SELECT '002' AS id, '都道府県' AS attr,'大阪' AS value
)
,
tab2 AS (
SELECT id,  MAP_AGG(attr, value) as attrs FROM tab1
GROUP BY id)

-- SELECT * FROM tab2

SELECT id
, attrs['性別'] AS sex
, attrs['年代'] AS age
, attrs['都道府県'] AS todofuken 
FROM tab2

イメージ画像

以上が、縦(行)で保持しているデータを横(列)に分割する処理についてのまとめでした。

次回は、逆に横持ちのデータを縦に変換するようなクエリについて書いていこうと思います。

最後までご覧いただきありがとうございました。

コメント