我具有类似于以下内容的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宏中编写循环更简单的方法?
答案 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