我使用JSON_EXTRACT
从BigQuery列中提取JSON数据。现在我想提取值列表并对它们运行聚合函数(如AVG
)。在http://jsonpath.curiousconcept.com/上测试JsonPath表达式.objects[*].v
成功。但查询:
SELECT
JSON_EXTRACT(json_column, "$.id") as id,
AVG(JSON_EXTRACT(json_column, "$.objects[*].v")) as average_value
FROM [tablename]
在BigQuery上抛出 JsonPath解析错误。 这在BigQuery上是否可行?或者我是否需要对数据进行预处理才能针对JSON中的数据运行聚合函数?
我的数据与此类似:
# Record 1
{
"id": "abc",
"objects": [
{
"id": 1,
"v": 1
},
{
"id": 2,
"v": 3
}
]
}
# Record 2
{
"id": "def",
"objects": [
{
"id": 1,
"v": 2
},
{
"id": 2,
"v": 5
}
]
}
这与另一个question相关。
更新:运行两个查询可以简化问题。首先,运行JSON_EXTRACT
并将结果保存到视图中。其次,针对此视图运行聚合函数。但即便如此,我还需要更正JsonPath表达式$.objects[*].v
以阻止JSONPath parse error
。
答案 0 :(得分:6)
利用SPLIT()将可重复的字段转换为单独的行。也可能更容易/更清楚地将它放入子查询并将AVG放在外面:
SELECT id, AVG(v) as average
FROM (
SELECT
JSON_EXTRACT(json_column, "$.id") as id,
INTEGER(
REGEXP_EXTRACT(
SPLIT(
JSON_EXTRACT(json_column, "$.objects")
,"},{"
)
,r'\"v\"\:([^,]+),')) as v FROM [mytable]
)
GROUP BY id;