从 BigQuery 数据 JSON 中的数组中提取索引值

Posted

技术标签:

【中文标题】从 BigQuery 数据 JSON 中的数组中提取索引值【英文标题】:Extract index values from array in BiQuery data JSON 【发布时间】:2020-02-26 10:37:23 【问题描述】:

我已将数据从 Firestore 导入 BigQuery。我的数据结构是这样的:

data = [
  
    id: "item1",
    status: 
      options: [
        
          title: "Approved",
          color: "#00ff00"
        ,
        
          title: "Rejected",
          color: "#ff0000"
        ,
        
          title: "Pending",
          color: "#ffaa00"
        
      ],
      optionIndex: 0
    
  ,
  
    id: "item2",
    status: 
      options: [
        
          title: "Validated",
          color: "#00ff00"
        ,
        
          title: "Invalidated",
          color: "#ff0000"
        
      ],
      optionIndex: 1
    
  
];

我成功运行了一个查询,提取了id等键值:

SELECT
  JSON_EXTRACT(data, '$.id') AS item_id,
  JSON_EXTRACT(data, '$.status.optionIndex') AS option_index
FROM `my_bigquery_table`

但是,我很难找到选择 status.options[status.options.optionIndex] 的解决方案,我可以在其中将状态的标题和颜色放入表格中。我一直追求的结果是:

id,status_title,status_color
item1,Approved,#00ff00
item2,Invalidated,#ffaa00

(我对包括连接在内的大多数基本 SQL 都做得很好,但是将状态数组放入可查询的结构中,我可以在其中选择索引并没有在我的级别内)

【问题讨论】:

我对结构化数据和 JSON 遍历的混合感到非常困惑 - 你的表的架构是什么? 对不起。 JSON 数据结构是 Firestore 导入器创建的表中的“数据”列。 IE。这就是 Firestore 中文档的结构方式,并将此内容结构复制到导入表中的数据列。我对 BigQuery 还很陌生,但我知道这很正常。但它确实使 SQL 查询非常糟糕,我必须查询该 JSON 字符串。我可能遗漏了什么? 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
  return JSON.parse(input).map(x=>JSON.stringify(x));
'''; 
SELECT 
  JSON_EXTRACT_SCALAR(data, '$.id') AS id,
  JSON_EXTRACT_SCALAR(option, '$.title') AS status_title,
  JSON_EXTRACT_SCALAR(option, '$.color') AS status_color
FROM `project.dataset.my_bigquery_table`,
UNNEST([json2array(JSON_EXTRACT(data, '$.status.options'))[OFFSET(CAST(JSON_EXTRACT_SCALAR(data, '$.status.optionIndex') AS INT64))]]) option  

如果应用于您问题中的样本数据 - 输出是

Row id      status_title    status_color     
1   item1   Approved        #00ff00  
2   item2   Invalidated     #ff0000  

【讨论】:

以上是关于从 BigQuery 数据 JSON 中的数组中提取索引值的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Bigquery:从 json 数组中提取数据

从 Google Ads BigQuery 数据传输中提取/取消嵌套数组

Google BigQuery SQL:从 JSON(列表和数组)中提取数据到列中

Bigquery 为其余数据输出带有 json 数组对象的不同 zip 行