如何用BigQuery中带字符串列的表B更新表A的结构体数组列?
问题分析与解决方案
你的核心问题是类型不匹配:表A的experience字段是数组类型(Array of Struct),但你在UPDATE语句中直接赋值了一个结构体,两者类型无法兼容,导致执行报错。
修正后的SQL语句
根据你使用的SQL引擎不同,语法略有差异:
1. Spark SQL 场景
如果需要将experience更新为包含单个结构体元素的数组(替换原数组),使用array()包裹struct()来构造符合类型要求的数组:
UPDATE A SET experience = array( struct( B.company AS company, B.starts_at AS starts_at, B.ends_at AS ends_at, B.eid AS eid, B.title AS title, B.location AS location ) ) FROM B WHERE A.id = B.id;
2. Hive SQL 场景
Hive中构造命名结构体需要用named_struct(),同样用array()包裹以匹配数组类型:
UPDATE A SET experience = array( named_struct( 'company', B.company, 'starts_at', B.starts_at, 'ends_at', B.ends_at, 'eid', B.eid, 'title', B.title, 'location', B.location ) ) FROM B WHERE A.id = B.id;
额外说明
如果你的需求不是替换整个experience数组,而是更新数组中某个特定的结构体元素,需要使用数组遍历函数(比如Spark SQL的transform)来定位并替换元素,示例如下(Spark SQL):
UPDATE A SET experience = transform( experience, x -> CASE WHEN /* 这里写匹配要替换元素的条件,比如x.eid = B.eid */ THEN struct(B.company, B.starts_at, B.ends_at, B.eid, B.title, B.location) ELSE x END ) FROM B WHERE A.id = B.id;
内容的提问来源于stack exchange,提问作者AlmightyHeathcliff
相关产品推荐
相关产品推荐

