选择查询以使用 BigQuery 对输出 json 中的记录进行分组
Posted
技术标签:
【中文标题】选择查询以使用 BigQuery 对输出 json 中的记录进行分组【英文标题】:Select query to group records in output json using BigQuery 【发布时间】:2020-02-17 18:16:21 【问题描述】:我在 BigQuery 中有一个日期时间分区表,其架构如下:
timestamp TIMESTAMP REQUIRED
customer_id STRING REQUIRED
plant_id STRING REQUIRED
inverters RECORD REPEATED
inverters. id STRING REQUIRED
...
所以,如果我执行SELECT * FROM
my_table`,它会生成一个 JSON 结构如下:
[
"timestamp": "2019-10-20 20:00:00 UTC",
"customer_id": "5d3f1aee5f70740d54c416e1",
"plant_id": "5d658cb25f70747626153e83",
"inverters": [
"id": "5d77e3225f70746ec02bd8e7",
...
,
...
]
,
...
]
这种格式在我的大多数用例中都很好用,除了一个。
所以,如果我想要所有逆变器的 ID,我会这样做
SELECT DISTINCT id
FROM `my_table`
CROSS JOIN UNNEST(inverters)
但我还需要按逆变器分组的时间戳,但如果我这样做,假设是一个用于按 id 获取时间戳的嵌套查询,例如:
SELECT inverter, timestamp
FROM (
SELECT DISTINCT id
FROM `my_table`
CROSS JOIN UNNEST(inverters)
) AS inverter, `my_table`
那么生成的 json 将是:
[
"inverter":
"id": "5d791a505f70744c233b819d"
,
"timestamp": "2020-01-21 11:15:00 UTC"
,
"inverter":
"id": "5d791a505f70744c233b819d"
,
"timestamp": "2020-01-21 00:20:00 UTC"
,
"inverter":
"id": "5d791a505f70744c233b819d"
,
"timestamp": "2020-01-21 04:05:00 UTC"
,
...
]
现在,这是一个很长的介绍。
问题是:有没有办法查询数据,使查询结果看起来像下面这样?
[
"inverter":
"id": "5d791a505f70744c233b819d",
"timestamp": [
"2020-01-21 11:15:00 UTC",
"2020-01-21 00:20:00 UTC",
"2020-01-21 04:05:00 UTC",
...
]
,
...
]
【问题讨论】:
【参考方案1】:这是你想要的吗?
SELECT inverter.id, ARRAY_AGG(timestamp)
FROM `my_table` t CROSS JOIN
UNNEST(t.inverters) inverter
GROUP BY inverter.id;
你说SELECT *
返回 JSON。我认为这是您的 API 的功能。使用 BigQuery API 时,您看不到 JSON。
【讨论】:
这几乎正是我所需要的,只是不是使用GROUP BY inverter
,而是GROUP BY inverter.id
。我不知道ARRAY_AGG
函数,谢谢。以上是关于选择查询以使用 BigQuery 对输出 json 中的记录进行分组的主要内容,如果未能解决你的问题,请参考以下文章
需要 SQL 查询帮助以解析 BigQuery 表中的 JSON 数据
如何使用 Google Bigquery 的 Java API 以 Json 形式获取查询结果
Bigquery 为其余数据输出带有 json 数组对象的不同 zip 行