【问题标题】:BigQuery - Extract data from an array of Json filesBigQuery - 从一组 Json 文件中提取数据
【发布时间】: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。第二个不包含有趣的值。抱歉,我无法显示数据。

标签: arrays json google-bigquery


【解决方案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

返回:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2019-01-22
    相关资源
    最近更新 更多