标准SQL-STRUCT的阵列中有多行

时间:2019-12-20 21:53:29

标签: sql google-bigquery

我具有类似于以下内容的JSON结构:

{"Name": "Value 1",
 "Colors": {
   {"Basic colors": {
      "Primary colors": {
         [{"First Color":"Blue", "Second Color": "Red"}]
      }
    }
  }
}

使用JSON_EXTRACT(Name.Colors, '$.Basic_colors[0].Primary_colors)我可以返回一个结构的数组,然后从该结构中提取值。但是,“原色”中可以有多个项目,例如:

[{"First Color":"Blue", "Second Color": "Red"},{"First Color":"Green", "Second Color": "Orange"}]

理想的解决方案:

Name    |   First Color  |  Second Color  

Value 1 |   Blue         |  Red

Value 1 |   Green        |  Orange

我遇到的问题是,当使用JSON_EXTRACT时,“主色”无法识别为数组或结构。它被视为一个字符串(可以理解,但也不能成为CAST()-因此不能成为UNNEST()。

我遇到的第二个问题是,尽管我可以使用JSON_extract索引数组中的[0]元素,但是我无法为每个元素循环生成包含所有子元素的新数据行。

我不能使用FNSPLIT,因为标准SQL不支持它。我相信我想使用UNNEST(),但是我不知道如何将STRUCT转换为数组中的第一个元素。我的python饱和大脑想循环: 用于范围内的项目(len(json_array)):

我不能在生产中使用Python,并且必须有比在SQL宏中编写循环更简单的方法?

1 个答案:

答案 0 :(得分:1)

以下BigQuery标准SQL示例

#standardSQL
CREATE TEMP FUNCTION JsonToArray(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(input).map(x=>JSON.stringify(x));
"""; 
WITH `project.dataset.table` AS (
  SELECT '''{
  "Name": "Value 1",
  "Colors": {
    "Basic_colors": {"Primary_colors": [
      {"First_Color":"Blue", "Second_Color": "Red"},
      {"First_Color":"Green", "Second_Color": "Orange"}
     ]
   }
  }}''' json
)
SELECT 
  JSON_EXTRACT_SCALAR(json,'$.Name') Name, 
  JSON_EXTRACT_SCALAR(item, '$.First_Color') First_Color,
  JSON_EXTRACT_SCALAR(item, '$.Second_Color') Second_Color
FROM `project.dataset.table`, 
UNNEST(JsonToArray(JSON_EXTRACT(json,'$.Colors.Basic_colors.Primary_colors'))) item

有输出

Row Name    First_Color Second_Color     
1   Value 1 Blue        Red  
2   Value 1 Green       Orange