BigQuery - 从一组 Json 文件中提取数据
Posted
技术标签:
【中文标题】BigQuery - 从一组 Json 文件中提取数据【英文标题】:BigQuery - Extract data from an array of Json files 【发布时间】:2019-09-27 09:21:40 【问题描述】:早上好,
在大查询中,我有一个表格,其中包含以下表格的一列(我显示 3 行):
['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12]
['a':9,'b':10, 'c':9]
[ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9]
也就是说,我有一个 Json 数组(不是固定长度)。对于我想提取的每一行(创建一个新列),如果存在,当键 'a'=1 时键 'b' 的值(对于每一行,键 'a' 可以等于 1一度)。我无法导入外部包。
感谢您的帮助!
【问题讨论】:
你能贴一张第一行的截图吗(也是想要的输出的一个例子)?知道表的架构也很棒,因为我看到它看起来像嵌套的重复字段会很好地工作。 我写了第一行树。只有一张一列的表。在这种情况下,我想要的输出是一个带有数值的列,在这种情况下,第一行是 4,第三行是 10。第二个不包含有趣的值。抱歉,我无法显示数据。 Bigquery - json_extract all elements from an array的可能重复 【参考方案1】:以下是 BigQuery 标准 SQL
#standardSQL
CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(json).map(x=>JSON.stringify(x));
""";
WITH `project.dataset.table` AS (
SELECT "['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12]" json UNION ALL
SELECT "['a':9,'b':10, 'c':9]" UNION ALL
SELECT "[ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9]"
)
SELECT json, JSON_EXTRACT_SCALAR(x, '$.b') AS b
FROM `project.dataset.table`,
UNNEST(json2array(JSON_EXTRACT(json, '$'))) x
WHERE JSON_EXTRACT_SCALAR(x, '$.a') = '1'
结果
Row json b
1 ['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12] 4
2 [ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9] 10
如果您需要保留所有原始行 - 请在下面使用
#standardSQL
CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(json).map(x=>JSON.stringify(x));
""";
WITH `project.dataset.table` AS (
SELECT "['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12]" json UNION ALL
SELECT "['a':9,'b':10, 'c':9]" UNION ALL
SELECT "[ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9]"
)
SELECT json,
(SELECT JSON_EXTRACT_SCALAR(x, '$.b')
FROM UNNEST(json2array(JSON_EXTRACT(json, '$'))) x
WHERE JSON_EXTRACT_SCALAR(x, '$.a') = '1'
) AS b
FROM `project.dataset.table`
结果
Row json b
1 ['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12] 4
2 ['a':9,'b':10, 'c':9] null
3 [ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9] 10
【讨论】:
非常感谢!!这正是我想要的。【参考方案2】:自 2020 年 5 月 1 日起,已添加 JSON_EXTRACT_ARRAY 功能,并且 可用于从 json 中检索数组。
#standardSQL
WITH `yourTable` AS (
SELECT "['a':1,'b':4, 'c':5, 'a':0,'b':7, 'c':8,'a':4,'b':9, 'c':12]" json_blob UNION ALL
SELECT "['a':9,'b':10, 'c':9]" UNION ALL
SELECT "[ 'a':5,'b':10, 'c':9, 'a':1,'b':10, 'c':9, 'a':7,'b':10, 'c':9]"
)
SELECT
(select
json_extract_scalar(split_items,'$.b') as b
from unnest(json_extract_array(json_blob)) split_items
where json_extract_scalar(split_items,'$.a')='1'
) as b
from yourTable
返回:
【讨论】:
以上是关于BigQuery - 从一组 Json 文件中提取数据的主要内容,如果未能解决你的问题,请参考以下文章