查询 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 重复字段的主要内容,如果未能解决你的问题,请参考以下文章

bigquery 嵌套和重复字段查询

BigQuery 从查询中创建重复记录字段

从 BigQuery 中的查询返回一个数组(重复字段)

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

如何查询非规范化 BigQuery 表以输出嵌套和重复的字段

我可以通过单个查询将多个 BigQuery 列合并到一个重复字段中吗?