如何将聚合函数应用于从Google BigQuery中的JSON中提取的数据?

时间:2014-10-28 18:42:49

标签: sql json aggregate-functions google-bigquery google-cloud-sql

我使用JSON_EXTRACTBigQuery列中提取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

1 个答案:

答案 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;