google-bigquery - bigquery 中的 jsonpath 不支持 @ 过滤。对替代品的建议?
问题描述
在https://jsonpath.curiousconcept.com/使用此 JSON 文档:
[{
"key": "name",
"value": "john doe"
}, {
"key": "age",
"value": "8"
}, {
"key": "gender",
"value": "male"
}]
我可以使用 JsonPath 表达式$[?(@.key=="age")].value
来提取["8"]
我想要的值。
但是,当我尝试在 bigquery 中使用相同的 JsonPath 时,如下所示:
select JSON_EXTRACT_SCALAR('[{"key": "name","value": "john-doe"}, {"key": "age","value": "8"}, {"key": "gender","value": "male"}]', '$[?(@.key=="age")].value')
我收到一个错误
JSONPath 中不支持的运算符:@
关于如何在 bigquery 中实现这一点的任何建议?
解决方案
以下是 BigQuery 标准 SQL
#standardSQL
CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS STRING
LANGUAGE js AS """
try { var parsed = JSON.parse(json);
return JSON.stringify(jsonPath(parsed, json_path));
} catch (e) { return null }
"""
OPTIONS (
library="https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jsonpath/jsonpath-0.8.0.js.txt"
);
WITH `project.dataset.your_table` AS (
SELECT '''
[{
"key": "name",
"value": "john doe"
}, {
"key": "age",
"value": "8"
}, {
"key": "gender",
"value": "male"
}]
''' str
)
SELECT CUSTOM_JSON_EXTRACT(str, '$[?(@.key=="age")].value')
FROM `project.dataset.your_table`
注意:可以从https://code.google.com/archive/p/jsonpath/downloads直接链接到托管的 jsonpath-0.8.0.js 库。
如果您愿意,可以将文件复制到 Cloud Storage 上的 your_bucket 并使用“gs://your_bucket/path/jsonpath-0.8.0.js”作为 OPTIONS 库 URI。
上述方法克服了 JsonPath 的 BigQuery“限制”,现在您可以使用所有“常规”JsonPath 功能
推荐阅读
- installation - 安装程序 PHOEBE 2
- javascript - 怎么把id放在url中间
- algorithm - Lamport同步算法讨论中的“部分排序”和“全排序”是什么意思?
- github - 仅当 pr 目标为 master 时才运行 GitHub 操作
- laravel-5.8 - 使用迁移的原因是在mysql中创建一个表
- python - 使用每次更改的变量来评估公式
- php - 如何使用 Postgresql 和 Codeigniter 更新多个表
- powershell - PowerShell如何根据字符串中值的变化将文本文件拆分为多个
- python - 如何使用 keras fit_generator 处理最后一批
- composer-php - 如何将作曲家用于基于服务器和前端的组件