ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

Athenaのunnestでjson配列を分解したら便利だった

はい。タイトル通りなのですが、Athenaでjsonの配列を扱うときに
unnestで分解したら便利だったので、備忘録として残しておきたいと思います。

まあ他にも同様の記事はあるので、そちらも参考にしてみてください。

以下のようなjson形式のデータが、S3などに入っているとします。
(実際のデータじゃないので適当なサンプルですが)

{"name": "test1", "ary": [{"key": "key1", "value", "value1"}, {"key": "key2", "value", "value2"}, {"key": "key3", "value", "value3"}]

一つのjsonの中に「ary」のような配列形式の要素を持っている場合、unnestを使うと
これを以下のように分割して表示することができます。

name key value
test1 key1 value1
test1 key2 value2
test1 key3 value3

3つの要素がある「ary」を分解して、3行で表示しています。
この分解にunnestを使うのですが、以下のようなクエリとなります。
(元データを参照するテーブル名は「table1」とします)

SELECT
    name,
    json_extract(ary_unnest, '$.key') AS key, --3.
    json_extract(ary_unnest, '$.value') AS value --3.
FROM
(
    SELECT
        name,
        CAST(ary AS array(json)) AS ary_json -- 1.
    FROM
        table1,
        unnest(ary_json) AS t(ary_unnest) -- 2.
)

クエリにはポイントとなる所に番号をコメントしておきました。それぞれの簡単な説明を書くと

1.「ary」をjson配列の型にcastする
2. castしたjson配列をunnsetで分割して「ary_unnest」と別名をつける
3. 分割した「ary_unnest」から、配列内の要素の「key」「value」の値を抽出する

となります。

実際に書いたクエリを見ながら書いているわけではないので、そのままでは動かないかもしれませんが
ポイントとしては大体こんな感じです。

詳細などは(私も参考にした)以下の公式の記事を参考にしてください。

ネストされた配列のフラット化 - Amazon Athena