查询 Bigquery 重复字段
Posted
技术标签:
【中文标题】查询 Bigquery 重复字段【英文标题】:Querying on Bigquery repeated fields 【发布时间】:2018-10-11 20:10:00 【问题描述】:下面是我的 BigQuery 表的架构。我正在选择 sentence_id、store 和 BU_model,并将数据插入 BigQuery 中的另一个表。生成的新表的数据类型分别为整数、重复和重复。 我想展平/取消嵌套重复的字段,以便在我的第二个表中将它们创建为 STRING 字段。如何使用标准 sql 来实现?
+- sentences: record (repeated)
| |- sentence_id: integer
| |- autodetected_language: string
| |- processed_language: string
| +- attributes: record
| | |- agent_rating: integer
| | |- store: string (repeated)
| +- classifications: record
| | |- BU_Model: string (repeated)
我用来创建第二个表的查询如下。我想将 BU_Model 作为 STRING 列进行查询。
SELECT sentence_id ,a.attributes.store,a.classifications.BU_Model
FROM staging_table , unnest(sentences) a
预期输出应如下所示:
暂存表:
41783851 regions Apparel
district Footwear
12864656 regions
district
最终目标表:
41783851 regions Apparel
41783851 regions Footwear
41783851 district Apparel
41783851 district Footwear
12864656 regions
12864656 district
我尝试了以下查询,它似乎按预期工作,但这意味着我必须取消嵌套每个预期的重复字段。我在 Bigquery 中的表有 50 多个重复的列。有没有更简单的方法解决这个问题?
SELECT
sentence_id,
flattened_stores,
flattened_Model
FROM `staging`
left join unnest(sentences) a
left join unnest(a.attributes.store) as flattened_stores
left join unnest(a.classifications.BU_Model) as flattened_Model
【问题讨论】:
【参考方案1】:假设您仍然希望输出中包含三列 - 数组被展平为字符串
SELECT sentence_id ,
ARRAY_TO_STRING(a.attributes.store, ',') store,
ARRAY_TO_STRING(a.classifications.BU_Model, ',') BU_Model
FROM staging_table , unnest(sentences) a
更新以解决问题的最新变化
在 BigQuery 标准 SQL 中 - 使用 LEFT JOIN UNNEST()
(就像您在上一个查询中所做的那样)是执行您想要得到的结果的最合理方法
在 BigQuery 旧版 SQL 中 - 您可以使用 FLATTEN
语法 - 但它具有相同的缺点,即需要对所有 50 列以上的列重复相同的操作
非常简单的例子:
#legacySQL
SELECT sentence_id, store, BU_Model
FROM (FLATTEN([project:dataset.stage], BU_Model))
结论:我会选择LEFT JOIN UNNEST()
的方法
【讨论】:
嗨 Mikhail- 我刚刚编辑了关于预期输出的问题 您的预期输出对我来说没有多大意义,因为它确实交叉连接了商店和模型中的值 - 请澄清/确认这正是您想要的 特别是列的交叉连接对于 50+ 列来说将是一个问题。我觉得你应该重新考虑你的设计/要求 谢谢米哈伊尔。我同意 50 多列是连接中的一个问题,唯一的方法是将键和重复列拆分到不同的表中,然后根据业务的用例将它们连接起来。现在,由于要求只有 2,我们对上述方法很好。 有道理:o)以上是关于查询 Bigquery 重复字段的主要内容,如果未能解决你的问题,请参考以下文章