2020 年 5 月 1 日更新
一个新函数 JSON_EXTRACT_ARRAY 刚刚添加到 JSON 函数列表中。此函数允许您将 JSON 文档的内容提取为字符串数组。
所以在下面你可以用CUSTOM_JSON_EXTRACT
内置函数替换 UDF 的使用JSON_EXTRACT_ARRAY
,如下例所示
#standardSQL
SELECT
JSON_EXTRACT_SCALAR(json , '$.X') AS X,
JSON_EXTRACT_SCALAR(json , '$.Y') AS Y
FROM t, UNNEST(JSON_EXTRACT_ARRAY(json_column , '$')) json
===============
下面是 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
注意:为了克服当前 BigQuery 对 JsonPath 的“限制”,上述解决方案使用自定义函数以及外部库-jsonpath-0.8.0.js
可以从https://code.google.com/archive/p/jsonpath/downloads下载并上传到 Google Cloud Storage - gs://your_bucket/jsonpath-0.8.0.js
只需重新阅读 Felipe 的答案 - 对于他上面的示例,解决方案将如下所示(仅供参考)
SELECT
id,
CUSTOM_JSON_EXTRACT(payload, '$.commits[*].author.email') emails
FROM `githubarchive.day.20180830`
WHERE type='PushEvent'
AND id='8188163772'