私はjsonの一連のすべてのjsonから2つのキーを抽出しようとしています(SQLレガシーを使用)現在json抽出関数を使用しています:
json_extract(json_column , '$[1].X') AS X,
json_extract(json_column , '$[1].Y') AS Y,
[1](たとえば)だけでなく、「json arry column」のすべてのjsonで実行するにはどうすればよいですか?
Jsonの例:
[
{"blabla":000,"X":1,"blabla":000,"blabla":000,"blabla":000,,"Y":"2"},
{"blabla":000,"X":3,"blabla":000,"blabla":000,"blabla":000,,"Y":"4"},
]
前もって感謝します!
同様の問題から始めましょう-これは、json配列からすべての電子メールを抽出するための非常に便利な方法ではありません。
SELECT id
, [ JSON_EXTRACT_SCALAR(JSON_EXTRACT(payload, '$.commits'), '$[0].author.email')
, JSON_EXTRACT_SCALAR(JSON_EXTRACT(payload, '$.commits'), '$[1].author.email')
, JSON_EXTRACT_SCALAR(JSON_EXTRACT(payload, '$.commits'), '$[2].author.email')
, JSON_EXTRACT_SCALAR(JSON_EXTRACT(payload, '$.commits'), '$[3].author.email')
] emails
FROM `githubarchive.day.20180830`
WHERE type='PushEvent'
AND id='8188163772'
これに対処するための現時点での最善の方法は、UDFでJavaScriptを使用してjson配列をSQL配列に分割することです。
CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(json).map(x=>JSON.stringify(x));
""";
SELECT * EXCEPT(array_commits),
ARRAY(SELECT JSON_EXTRACT_SCALAR(x, '$.author.email') FROM UNNEST(array_commits) x) emails
FROM (
SELECT id
, json2array(JSON_EXTRACT(payload, '$.commits')) array_commits
FROM `githubarchive.day.20180830`
WHERE type='PushEvent'
AND id='8188163772'
)
以下のBigQuery標準SQLの例では、JSONPathを操作する標準的な方法に近づけることができ、追加の操作は必要ないため、CUSTOM_JSON_EXTRACT(json, json_path)
関数を使用するだけです
#standardSQL
CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return jsonPath(JSON.parse(json), json_path);
"""
OPTIONS (
library="gs://your_bucket/jsonpath-0.8.0.js"
);
WITH t AS (
SELECT '''
[
{"blabla1":1,"X":1,"blabla2":3,"blabla3":5,"blabla4":7,"Y":"2"},
{"blabla1":2,"X":3,"blabla2":4,"blabla3":6,"blabla4":8,"Y":"4"}
]
''' AS json_column
)
SELECT
CUSTOM_JSON_EXTRACT(json_column , '$[*].X') AS X,
CUSTOM_JSON_EXTRACT(json_column , '$[*].Y') AS Y
FROM t
結果は
Row X Y
1 1 2
3 4
注:JsonPathに対する現在のBigQueryの「制限」を克服するために、上記のソリューションでは カスタム関数 とともに 外部ライブラリ を使用します- https://からダウンロードできるjsonpath-0.8.0.js
code.google.com/archive/p/jsonpath/downloads およびGoogle Cloud Storageにアップロード-gs://your_bucket/jsonpath-0.8.0.js
ちょうどフェリペの答えを読み直してください-彼の上記の例の解決策は以下のようになります(FYIと同じように)
SELECT
id,
CUSTOM_JSON_EXTRACT(payload, '$.commits[*].author.email') emails
FROM `githubarchive.day.20180830`
WHERE type='PushEvent'
AND id='8188163772'