BigQuery中更新RECORD REPEATED类型字段报错求助
问题分析与解决方案
问题原因
你遇到的错误看似类型一致,实际是新生成的ARRAY<STRUCT>结构和目标表eventInfo字段的原生结构不匹配——BigQuery对STRUCT类型校验严格,要求字段的顺序、名称、类型完全一致,哪怕字段列表看起来一样,只要顺序不对或者遗漏了原STRUCT中的字段,就会触发类型不匹配错误。另外你的原查询会过滤掉所有不满足WHERE条件的eventInfo元素,导致更新后数组丢失未匹配的记录。
修正后的查询
UPDATE `business-intelligence-251208.WIS_DWH.testUpdate` SET eventInfo = ARRAY( SELECT AS STRUCT e.* REPLACE( COALESCE(n.newOperator, e.operator) AS operator ) FROM UNNEST(eventInfo) AS e LEFT JOIN `business-intelligence-251208.WIS_DWH.OPERATOR_MAPPING_TPP` AS n ON e.eventAction = LOWER(n.pretty_link) AND e.operator = 'Operator Not Mapped' ) WHERE TRUE;
关键修改点
- 保留原STRUCT完整结构:用
e.* REPLACE(...)代替手动列举所有字段,确保新STRUCT的字段顺序、名称、类型和原表完全一致,避免类型不匹配。 - 保留未匹配元素:使用
LEFT JOIN替代原查询的交叉JOIN,原数组中不满足匹配条件的元素会被保留,不会丢失。 - 安全替换字段:用
COALESCE(n.newOperator, e.operator)确保只有匹配到映射关系且原operator为'Operator Not Mapped'的元素才会更新operator值,其他情况保留原字段值。
内容的提问来源于stack exchange,提问作者Frank Diaz
相关产品推荐
相关产品推荐

