BigQuery如何批量将STRUCT结构体字段展开为独立列
BigQuery 批量展开STRUCT子字段为独立列实现方法
直接用BigQuery原生支持的语法即可,不需要手动枚举字段,两种常用方案按需选择:
方案1:.* 直接展开(优先使用,零配置)
对STRUCT类型字段直接加.*后缀,引擎会自动把该结构体下所有子属性展开为独立列,效果和手动逐个写user.xxx完全一致,不管结构体有多少个子字段都能一次性处理。
示例代码:
SELECT `consignment id`, -- 字段名带空格记得用反引号包裹 user.* FROM tbl
补充说明:
- 展开后的列名直接沿用STRUCT内部的属性名,比如会自动生成
name、externalId列- 该写法无额外性能损耗,和手动枚举字段的执行效率完全一致
- 如果是REPEATED(数组型)STRUCT,先UNNEST再展开即可:
SELECT `consignment id`, u.* FROM tbl, UNNEST(user) AS u
方案2:元数据动态生成字段列表(适合自定义场景)
如果需要给展开的字段统一加前缀、过滤部分子字段、或者处理多层嵌套结构,可以通过系统信息表自动拼接字段列表,不用手动敲写:
执行下面的语句,把项目、数据集、表名替换成你自己的,就能直接得到拼接完成的所有STRUCT子字段片段:
SELECT STRING_AGG( FORMAT('user.%s AS user_%s', field_path, REPLACE(field_path, '.', '_')), ', ' ORDER BY field_path ) AS generated_select_clause FROM `你的项目ID.你的数据集名.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS` WHERE table_name = 'tbl' AND field_path LIKE 'user.%' -- 匹配user结构体下的所有子属性,支持多层嵌套的子字段
执行后返回的字符串就是所有user.xxx AS user_xxx的字段片段,直接复制到SELECT语句里用即可,上百个字段也能一秒生成。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

