BigQuery的events_*表新增privacy_info列导致union报错如何解决
Firebase BigQuery事件表Union列不匹配问题官方解决方案
Firebase导出到BigQuery的事件表会在启用广告跟踪、隐私合规等相关功能后,自动在新生成的events_*日表中新增privacy_info列,更早生成的历史事件表、当日的events_intraday_*实时表不会同步追加该列,因此会触发Union操作因列结构不一致报错的问题,官方推荐以下两种解决方案:
- 方案一(首推):使用BigQuery标准SQL的
UNION ALL BY NAME语法代替普通Union操作
该语法会自动按列名匹配两个表的字段,缺失列会自动填充NULL值,后续表结构自动新增其他字段时也无需调整查询逻辑,适配性最强。
参考查询示例:
SELECT * FROM `你的项目ID.你的数据集ID.events_*` UNION ALL BY NAME SELECT * FROM `你的项目ID.你的数据集ID.events_intraday_*`
- 方案二:显式声明所有查询列,缺失字段手动补NULL
适合需要固定输出列结构、不希望后续表新增字段影响查询输出的场景,需要保证Union两侧的列顺序、列类型完全一致。
参考查询示例:
SELECT event_date, event_timestamp, event_name, -- 其余你需要使用的原有业务列 privacy_info FROM `你的项目ID.你的数据集ID.events_*` UNION ALL SELECT event_date, event_timestamp, event_name, -- 和上方顺序完全一致的原有业务列 CAST(NULL AS STRUCT<ads_storage_status STRING, analytics_storage_status STRING, uses_transient_token BOOLEAN>) AS privacy_info FROM `你的项目ID.你的数据集ID.events_intraday_*`
注:
privacy_info列为STRUCT结构,补NULL时可以用CAST指定结构保证类型一致,也可以直接写NULL AS privacy_info,BigQuery会自动适配类型。
内容的提问来源于stack exchange,提问作者user2413964
相关产品推荐
相关产品推荐

