BigQuery表UNION时如何调整嵌套重复字段列顺序解决类型不兼容问题
BigQuery 嵌套STRUCT表UNION ALL不兼容问题解决方案
根因说明
BigQuery的STRUCT类型兼容性校验同时关联内部字段顺序、字段名称、字段类型三个属性。即使两张表的products字段均为ARRAY<STRUCT>且包含的子字段完全一致,只要STRUCT内部的子字段排列顺序不同,就会触发UNION ALL的类型不匹配报错。
可落地实现方案
无需修改源表Schema,仅在查询时对齐STRUCT字段顺序即可,常用两种实现方式:
方式1:手动对齐STRUCT内部字段顺序(性能最优,适合结构简单的场景)
先确认其中一张表的STRUCT内部字段顺序,在查询另一张表时按相同顺序重构STRUCT即可,示例代码如下:select id, timestamp, products, count_total_visit, count_unique_session from table1 union all select id, timestamp, -- 此处STRUCT字段顺序完全对齐table1的products子字段顺序即可 array( select as struct name, `group`, price, id from unnest(products) ) as products, count_total_visit, count_unique_session from table2注意:如果存在多层嵌套STRUCT,每一层STRUCT都需要按相同逻辑对齐字段顺序。
方式2:JSON转换自动对齐(无需手动核对字段顺序,适合复杂嵌套场景)
通过JSON序列化和反序列化,让BigQuery按字段名自动匹配,忽略原STRUCT的字段顺序:select id, timestamp, products, count_total_visit, count_unique_session from table1 union all select id, timestamp, array( select as struct * from unnest(parse_json( to_json_string(products), format => 'ARRAY<STRUCT<name STRING, `group` STRING, price INT64, id STRING>>' )) ) as products, count_total_visit, count_unique_session from table2提示:将
format参数中的STRUCT结构替换为你实际的字段名和对应类型即可。
结构校验方法
可以通过以下语句快速确认两张表的STRUCT内部字段顺序,确认对齐规则:
-- 查看table1的products字段STRUCT结构 select json_schema(to_json_string(products[0])) from table1 limit 1; -- 查看table2的products字段STRUCT结构 select json_schema(to_json_string(products[0])) from table2 limit 1;
内容的提问来源于stack exchange,提问作者khusnanadia
相关产品推荐
相关产品推荐

