You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:00:04