如何在Google BigQuery中将数组结构体展平为列
Google BigQuery 数据转换方案
针对你描述的场景,提供两种实现数据转换的方法:
方法一:直接从原始表(含array<struct<key:string,value:string>>字段)转换
原始表中每个source下的data数组按Date/Country/Brand为一组重复出现,可通过拆分数组、分组、透视三步完成转换:
- 用
UNNEST将data数组拆分为单行记录 - 按
source分区,给每3条记录分配一个组ID(对应一组完整的Date/Country/Brand) - 按
source和组ID分组,将key值透视成独立字段
对应的BigQuery SQL代码:
WITH unnested_data AS ( SELECT source, data.key, data.value, -- 每3条记录划分为一组,生成组标识 DIV(ROW_NUMBER() OVER(PARTITION BY source ORDER BY (SELECT NULL)) - 1, 3) AS group_id FROM `你的项目ID.你的数据集ID.原始表名` CROSS JOIN UNNEST(data) AS data ) SELECT source, MAX(IF(key = 'Date', value, NULL)) AS date, MAX(IF(key = 'Country', value, NULL)) AS country, MAX(IF(key = 'Brand', value, NULL)) AS brand FROM unnested_data GROUP BY source, group_id ORDER BY source, date;
注意:如果
data数组内的key顺序不是固定的Date→Country→Brand,可以调整ROW_NUMBER()的排序逻辑,替换为实际业务中的顺序字段。
方法二:基于已生成的中间表转换
如果已经得到了中间格式的表,转换逻辑会更简单,直接提取各struct的value字段并重命名即可:
对应的BigQuery SQL代码:
SELECT source, date.value AS date, country.value AS country, brand.value AS brand FROM `你的项目ID.你的数据集ID.中间表名`;
内容的提问来源于stack exchange,提问作者dimi_fn
相关产品推荐
相关产品推荐

