BigQuery通配符查询分片表遇列级DDL报错求解决方案
解决BigQuery分片表通配符查询嵌套字段报错的方法
方法1:排除有结构冲突的分片表
根据错误提示,分片表test.FBADS_COUNTRY_20230525的action_values.1d_click字段存在列级DDL冲突,直接通过_TABLE_SUFFIX过滤掉该表即可:
SELECT (SELECT `1d_click` FROM unnest(action_values) WHERE action_type='video_view') AS video_view_value_1d_click FROM `test.FBADS_COUNTRY_202305*` WHERE _TABLE_SUFFIX != '20230525'
方法2:统一所有分片表的嵌套字段结构
如果需要包含20230525表的数据,可以先创建一个统一结构的视图,将所有分片表的action_values字段标准化:
CREATE OR REPLACE VIEW test.FBADS_COUNTRY_202305_unified AS SELECT * EXCEPT(action_values), ARRAY( SELECT AS STRUCT action_type, value, -- 用IFNULL给缺失/结构不一致的1d_click字段设置默认值,可根据实际业务调整 IFNULL(`1d_click`, 0) AS `1d_click` FROM UNNEST(action_values) ) AS action_values FROM `test.FBADS_COUNTRY_202305*`
之后查询这个视图即可正常使用通配逻辑:
SELECT (SELECT `1d_click` FROM unnest(action_values) WHERE action_type='video_view') AS video_view_value_1d_click FROM test.FBADS_COUNTRY_202305_unified
方法3:用UNION ALL逐个合并分片表
如果分片数量不多,直接放弃通配符,用UNION ALL逐个指定表名(若包含20230525,需单独处理其字段结构):
SELECT (SELECT `1d_click` FROM unnest(action_values) WHERE action_type='video_view') AS video_view_value_1d_click FROM `test.FBADS_COUNTRY_20230501` UNION ALL SELECT (SELECT `1d_click` FROM unnest(action_values) WHERE action_type='video_view') AS video_view_value_1d_click FROM `test.FBADS_COUNTRY_20230502` -- 依次添加其他分片表,若需包含20230525,需确保其1d_click字段与其他表兼容
报错原因说明
该错误是由于某张分片表(20230525)的action_values.1d_click字段列级DDL(如字段类型、是否可为空)与其他分片表不一致,BigQuery通配符查询无法解析这种结构冲突,因此报错。单独查询单表或使用value字段时,不存在跨表的结构冲突,所以可以正常执行。
内容的提问来源于stack exchange,提问作者Martynas Lukoševičius
相关产品推荐
相关产品推荐

