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 文件中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何循环 python 读取一组 HTML 文件并转储到 JSON

从 BigQuery 中的 JSON 数组中提取多个值

从 BigQuery 列中提取 Json 值

如何从 BigQuery 中的 JSON 字符串中提取数组

Bigquery:从 json 数组中提取数据

Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?