Spark Scala 基于目标JSON结构创建Schema报错问题咨询
Spark Scala嵌套StructType报错解决方案
核心差异说明
PySpark和Spark Scala的StructType实现确实存在差异:
- PySpark会自动将Python字典匹配为StructType结构,支持按键名映射,无需显式构造特殊类型
- Spark Scala对StructType的输入类型有严格限制:仅支持
org.apache.spark.sql.Row作为对应输入,Tuple、Map等集合类型不会被自动解析为Struct结构,这就是你遇到报错的直接原因。
除此之外你的代码还有两个需要修正的点:
- 你期望的JSON示例中
key5的方括号属于笔误,按照你定义的Schema,key5应为对象类型(大括号) key7对应的Schema是ArrayType(StructType),输入需为Row类型的数组,你当前写的嵌套Tuple不符合类型要求。
修复后代码
数据构造部分修正
将所有StructType对应的嵌套结构改为Row,数组部分改为Row的集合,注意Row内字段顺序必须和对应StructType中字段定义顺序完全一致:
import org.apache.spark.sql.Row import scala.collection.mutable.LinkedHashMap val outputDictSO = LinkedHashMap[String, Any]( "key1" -> "value1", "key2" -> "value2", "key3" -> "value3", "key4" -> "value4", "key5" -> Row( "value6", // 对应StructType中第一个字段key6 Array( Row("value8"), // 对应key7数组中第一个Struct的key8 Row("value9") // 对应key7数组中第二个Struct的key8 ) // 对应StructType中第二个字段key7 ) ) Row.fromSeq(outputDictSO.values.toSeq)
你定义的targetSchemaSO本身没有错误,无需修改。
可选优化:按键名构造Row
如果希望避免手动对齐字段顺序,可以封装工具方法,传入StructSchema和键值对Map,自动按Schema的字段顺序生成Row,适合复杂嵌套场景使用。
内容的提问来源于stack exchange,提问作者Josh D
相关产品推荐
相关产品推荐

