在BigQuery中如何将多列转换为RECORD或键值对数组?
解决方案:BigQuery将多列转换为键值对行
我来帮你搞定这个宽表转键值对长表的需求!在BigQuery里,用UNNEST结合数组构造的方式就能简洁实现,下面是具体的实现步骤和代码:
核心SQL示例
假设你的源表是your_dataset.your_table,执行以下SQL就能得到你想要的结果:
SELECT id, Name, kv.Key, kv.Value FROM `your_dataset.your_table`, UNNEST([ STRUCT('DOB' AS Key, DOB AS Value), STRUCT('Sex' AS Key, Sex AS Value) ]) AS kv
逻辑解释
- 构造键值对数组:用
STRUCT('列名' AS Key, 列值 AS Value)把每一列的名称和对应值打包成结构体,再把这些结构体放到一个数组中 - 拆分数组为行:通过
UNNEST()函数将数组拆分成独立的行,这样每一个键值对就对应一行数据
扩展说明
- 如果需要转换更多列,只需要在
UNNEST的数组里继续添加STRUCT元素即可,比如新增Email列的话,就加STRUCT('Email' AS Key, Email AS Value) - 如果各列数据类型不一致,
Value列会自动转换为兼容的通用类型(比如字符串)。如果需要强制统一类型,可以显式转换,比如CAST(DOB AS STRING) AS Value
执行上述SQL后,你的源数据就会转换成期望的目标表结构:
| Id | Name | Key | Value |
|---|---|---|---|
| 1 | Fred | DOB | 01.01.2001 |
| 1 | Fred | Sex | M |
内容的提问来源于stack exchange,提问作者MilleniumDK
相关产品推荐
相关产品推荐

