Snowflake JSONデータのロードについて その②
前回記事からの続きです。
前回は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