同版本Spark在Databricks与开源环境嵌套数组查询报错差异及配置咨询
问题解答
是的,Databricks Spark集群确实存在默认开启的额外语法增强配置,让这段代码可以正常运行,具体细节如下:
核心差异原因
这段代码的关键在于嵌套列的访问语法:mapped_trace.segments.shape。在原生开源Spark中,segments是array<struct<shape: ...>>类型,原生Spark会将.shape解析为数组索引访问,要求索引必须是整数类型,因此报错提示shape是字符串类型不符合要求。而Databricks对Spark SQL做了语法扩展,允许通过点符号直接提取数组内嵌套结构体的字段。
具体配置项
Databricks默认开启了spark.sql.parser.extendedNestedColumnSupport.enabled配置,值为true。该配置开启后,Spark SQL会自动识别array_column.struct_field这种语法,将其转换为对数组中每个结构体元素的字段提取操作(等效于调用transform(array_column, x -> x.struct_field)),从而正确返回嵌套的数组类型结果。
替代写法(原生Spark/Glue可用)
由于该配置是Databricks专有扩展,原生开源Spark和AWS Glue集群不支持这种语法,需显式使用transform函数改写查询:
select transform(mapped_trace.segments, s -> s.shape) as shape from ( select array(struct(array(struct(array(struct(2.0D as latitude, 1.0D as longitude)) as shape)) as segments) as mapped_trace )
内容的提问来源于stack exchange,提问作者user1894205
相关产品推荐
相关产品推荐

