下面是我的BigQuery表的架构。我正在选择句子ID,存储和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
答案 0 :(得分:2)
假设您仍需要在输出中保留三列-将数组展平为字符串
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 Standard 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()
方法