Databricks更新表时出现‘需struct类型却获string’错误如何解决?
问题:Databricks更新表时出现类型不匹配错误
在Databricks中创建表TabA,表结构为latitude float, longitude float, col1 string, col2 string,执行以下操作时触发错误:
create table TabA (latitude float, longitude float, col1 string,col2 string) utils.executequery( """ update TabA set col1 = ST_Envelope(col2)""" ) -- 尝试将输出转为字符串,但提示_tostring()不支持 utils.executequery(""" optimize TabA """) utils.executequery( """ update TabA set latitude = col1.Lat""" ) utils.executequery( """ optimize TabA """) utils.executequery( """ update TabA set longitude= col1.Long""" ) utils.executequery( """ optimize TabA """)
错误信息:
col1#22613: need struct type but got string
问题原因
ST_Envelope函数返回的是几何结构体(struct类型),但col1被定义为string类型,强行赋值会导致类型不兼容。后续尝试访问col1.Lat时,col1实际仍是字符串类型(无法存储结构体),因此触发"需要struct类型但得到string"的错误。
解决方案
方案1:新增几何字段存储结果(推荐)
不要用字符串字段存储几何结构体,新增专门的字段来承载ST_Envelope的结果,再从中提取坐标:
修改表结构,新增几何类型字段:
ALTER TABLE TabA ADD COLUMN envelope_geom struct<Lat: float, Long: float>;若
ST_Envelope返回标准几何类型,也可定义为geometry类型:ALTER TABLE TabA ADD COLUMN envelope_geom geometry;更新几何字段并提取坐标:
-- 存入ST_Envelope结果 UPDATE TabA SET envelope_geom = ST_Envelope(col2); OPTIMIZE TabA; -- 从几何字段提取经纬度 UPDATE TabA SET latitude = envelope_geom.Lat, longitude = envelope_geom.Long; OPTIMIZE TabA;
方案2:将几何结果转为字符串后再解析(不推荐,性能较低)
若必须用col1存储结果,可先用ST_AsText将几何转为WKT字符串,后续提取坐标时再转回几何类型:
更新
col1为几何字符串:UPDATE TabA SET col1 = ST_AsText(ST_Envelope(col2)); OPTIMIZE TabA;解析字符串提取经纬度:
UPDATE TabA SET latitude = ST_Y(ST_GeomFromText(col1)), longitude = ST_X(ST_GeomFromText(col1)); OPTIMIZE TabA;
关键注意点
ST_Envelope返回的是几何对象,不是字符串,不能直接存入字符串类型字段。- 只有struct或几何类型的字段才能通过
.Lat/.Long访问属性,字符串无法直接解析为结构体。
内容的提问来源于stack exchange,提问作者Vidhya
相关产品推荐
相关产品推荐

