Snowflake JSONデータのロードについて その②

2022/10/30に公開

前回記事からの続きです。
前回はJSON生データ用テーブルにロードして終わりました。
今回はその生データから任意のキーからバリューを取得してみたいと思います。

JSONデータ操作

cityの値を取り出す

下記JSONデータの1行目を例にしてみます。
このデータの"city":"Bakersfield"の"Bakersfield"のみを取得してみます。

{"id":1,"first_name":"Portia","last_name":"Gioani","gender":"Male","city":"Bakersfield","job":{"title":"Financial Analyst","salary":32000},"spoken_languages":[{"language":"Kazakh","level":"Advanced"},{"language":"Lao","level":"Basic"}],"prev_company":[]},

SQLでは下記のように書くことで取り出せます。
SELECT {カラム名}:{キー名} FROM {テーブル名}

SELECT RAW_FILE:city FROM OUR_FIRST_DB.PUBLIC.JSON_RAW

表示結果が長いので最初の4行のみ表示しています。

RAW_FILE:CITY
Bakersfield""
Louny""
Wates""
Umeå""

カラム名以外で値を取り出す

$(列番号)を指定しても同じ結果を得られます。
今回の場1列しか無いので$1しか指定できませんが・・・
SELECT {$(number)}:{キー名} FROM {テーブル名}

SELECT $1:city FROM OUR_FIRST_DB.PUBLIC.JSON_RAW

ロード後のカラム名の変更と邪魔なダブルクォーテーションの除去

現状カラム名がSELECT句の指定文字列になっているので、それの見栄えをよくします。
あと都市名のダブルクォーテーションも邪魔なので消していきます。

RAW_FILE:CITY
Bakersfield""

カラムの変更方法
as {変更後のカラム名}を指定することでカラム名を変更できます。
ダブルクォーテーションの消し方
::stringを指定することで文字列型に変換されダブルクォーテーションが消えます。

SELECT RAW_FILE:first_name::string as first_name  FROM OUR_FIRST_DB.PUBLIC.JSON_RAW;
FIRST_NAME
Portia
Dag
Heath
Dita

いい感じにまとめる

SELECT 
    RAW_FILE:id::int as id,  
    RAW_FILE:first_name::STRING as first_name,
    RAW_FILE:last_name::STRING as last_name,
    RAW_FILE:gender::STRING as gender

FROM OUR_FIRST_DB.PUBLIC.JSON_RAW;
ID FIRST_NAME LAST_NAME GENDER
1 Portia Gioani Male
2 Dag Croney Male
3 Heath Lackmann Female
4 Dita Deering Female
5 Nikki McCosh Female

ネストされたデータの取り出し方

このJSONデータにはネストされたデータが含まれています。
jobキーの中にtitleとsalaryという2つのキーがあり、それぞれにバリューもあります。
"job":{"title":"Financial Analyst","salary":32000}

{"id":1,"first_name":"Portia","last_name":"Gioani","gender":"Male","city":"Bakersfield","job":{"title":"Financial Analyst","salary":32000},"spoken_languages":[{"language":"Kazakh","level":"Advanced"},{"language":"Lao","level":"Basic"}],"prev_company":[]},

そのままSELECTしてもjobのキーだけしか取り出せません。

SELECT RAW_FILE:job as job  FROM OUR_FIRST_DB.PUBLIC.JSON_RAW;

親属性キー+ドット+子属性キーで取り出す

SELECT {カラム名}:{親属性キー}.{子属性キー}:{型指定} as {カラム名} FROM {テーブル名}
実際にsalaryを取り出してみます。

SELECT RAW_FILE:job.salary::INT as salary FROM OUR_FIRST_DB.PUBLIC.JSON_RAW;
SALARY
32000
43000
40800
14400

次回配列要素の取り出し方を見ていきたいと思います!

Discussion