Spark创建DataFrame报java.lang.String与struct类型不匹配错误如何解决
报错根因
你定义的DataFrame Schema最顶层仅包含1个names字段,该字段是嵌套Struct类型,内部包含name(字符串)和extraField(整数)两个子字段。但你提供的样例数据中,每个Row直接存放了字符串、整数两个独立值,没有将这两个值包装为嵌套Row来匹配names字段的Struct结构,Spark解析时发现首个位置拿到的是String类型,和预期的Struct类型不匹配,因此抛出异常。
修复方案
只需将样例数据中对应Struct的字段用Row嵌套包装即可,修改后代码如下:
val arrayStructData2 = Seq( // 外层Row对应DataFrame单行结构,内层Row匹配names字段的Struct结构 Row(Row("James", 2)), Row(Row("Alex", 3)) ) val arrayStructSchema2 = new StructType() .add("names",new StructType() .add("name", StringType) .add("extraField", IntegerType) ) val df = spark.createDataFrame(spark.sparkContext.parallelize(arrayStructData2),arrayStructSchema2) df.printSchema() df.show()
同类问题排查思路
- 先逐层打印Schema结构,对照校验数据的嵌套层级:每定义一层Struct类型,对应数据位置就要多包一层Row对象,嵌套层数必须完全匹配
- 校验同层级字段的顺序、类型和Schema定义完全一致:Spark的Struct是按位置匹配字段,而非按名称匹配,字段顺序错位也会触发类型不匹配错误
- 如果是从外部数据源读取的嵌套数据,优先打印数据源原生结构,再和自定义Schema做字段层级、类型、顺序的对齐校验
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

