【问题标题】:java.lang.String is not valid external type for schema of stringjava.lang.String 不是字符串模式的有效外部类型
【发布时间】:2021-11-29 14:29:51
【问题描述】:

鉴于此,过去似乎已经这样做了,但是...:

val arrayStructData2 = Seq(
      Row("James", 2),
      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()

我明白了:

...
Caused by: RuntimeException: java.lang.String is not a valid external type for schema of struct<name:string,extraField:int>

无法立即看到。

【问题讨论】:

    标签: scala dataframe apache-spark


    【解决方案1】:

    对于其他人,提醒一下,需要 Row(Row... 如:

    val arrayStructData2 = Seq(
          Row(Row("James", 2)),
          Row(Row("Alex", 3))
        )
    

    不那么明显的错误恕我直言。

    【讨论】:

      【解决方案2】:

      当您使用createDataFrame 创建DataFrame 时,您注册了架构,但实际上没有评估任何内容,这就是df.printSchema 按预期工作的原因。当您执行df.show 时,DataFrame 会被评估,Spark 会尝试将您给它的第一个值(在本例中为字符串)加载到struct 中,这会导致您看到runtimeException。这是 Spark 3.1.1 的 scaladoc:

      使用给定模式从包含行的 java.util.List 创建一个 DataFrame。确保提供的 List 的每一行的结构与提供的架构匹配是很重要的。否则会出现运行时异常。

      它告诉你你正试图将一个字符串强制转换为一个结构。

      【讨论】:

      • 看我的回答..
      猜你喜欢
      • 2022-08-16
      • 2021-07-23
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      相关资源
      最近更新 更多