在 BigQuery 中查询重复的键值字段

Posted

技术标签:

【中文标题】在 BigQuery 中查询重复的键值字段【英文标题】:Querying repeated key value fields in BigQuery 【发布时间】:2017-08-04 15:59:25 【问题描述】:

也许我没有得到明显的信息,但我没有得到正确的查询。

每个数据行有多个键值对(重复数据),例如: "row1":"data1","row2":"data2","row3":"key1":"value1","key2":"value2","row4":"key1A":"value1A ","key2A":"value2A"

我尝试获取在 row3 中设置了“key1”的所有记录的“value1”。与row4组合相同,所以如果设置了key2A,则给我对应的值。

我希望我正确地描述了我的问题。

编辑: 为了更好地理解,这是一个数据行的示例模式:

"exrow":"Example Data", "date":"2017-08-07", "hi": [ "cd":[ "index":1,"value":"car", "index":2,"value":"boat", "index":3,"value":"green", "index":4,"value":"blue" ], [...] ], [...]

因此'hi''cd'RECORD, REPEATED

所以我试图得到的是以下结果行: Example Data | 2017-08-07 | boat | blue

查询 - 只是为了理解 - 将是:

SELECT exrow, date, (SELECT hi.cd.value WHERE hi.cd.index=2), (SELECT hi.cd.value WHERE hi.cd.index=4) FROM table

所以我试图用相应的条件查询两个重复(嵌套?)的数据行。

我希望我现在解释得更好。

【问题讨论】:

不清楚 - 你的表的架构是什么? 我编辑了我的帖子并试图更好地解释它 您提供的架构很可能不正确,因为 BigQuery 中的 ARRAY 类型不支持 Nested Arrays - cloud.google.com/bigquery/docs/reference/standard-sql/… 【参考方案1】:

根据提供的数据,我的最佳猜测:

#standardSQL
WITH table AS (
 SELECT [STRUCT('key1' AS key,2 AS value), ('key2', 3), ('key3', 8)] arr
)

SELECT (SELECT value FROM UNNEST(arr) WHERE key='key2') result
FROM `table`
WHERE EXISTS(SELECT value FROM UNNEST(arr) WHERE key='key3' AND value=8)

【讨论】:

我还不太明白,因此我编辑了我的帖子并试图更好地解释它。 我设法通过结合使用 Joins 和 FLATTEN 来解决我的问题。但你的评论是我走上正轨的原因。谢谢!【参考方案2】:

你可以看看下面的一个:

SELECT
address.emailAddress, address.options.changeSource, address.options.type
from addresses.address
where address.options.type="main" or address.options.type="second"
group by address.emailAddress, address.options.changeSource, address.options.type

地址、电子邮件地址和选项是重复字段。

所以我们如何处理重复字段的第一个选项就是“分组依据”。

您可以使用的第二个选项是 FLATTEN。

有关更多信息,我推荐大查询参考 - 非常有用

https://cloud.google.com/bigquery/docs/reference/legacy-sql#flatten

【讨论】:

谢谢,我设法通过结合使用 Joins 和 FLATTEN 解决了​​我的问题。

以上是关于在 BigQuery 中查询重复的键值字段的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:将数组中的键值对转换为列

HashMap如何插入重复的键值

JSON 表架构到 bigquery.TableSchema 用于 BigQuerySink

查询 Bigquery 重复字段

mysql 查询结果把一个字段的值赋值给另一个字段的键值

如何关联多个 BigQuery 数组字段?