java.lang.String is not a valid external type for schema of int

关于"java.lang.String is not a valid external type for schema of int"解决方法。

问题描述

#sparksession.sql(select * from …)出现java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: java.lang.String is not a valid external type for schema of int

解决方法

是根据一个博主的帖子得到的启发,例子如下:

val spark = SparkSession.builder()
  .appName("Duplicate Detection")
  .master("local[*]")
  .getOrCreate()

import spark.implicits._

val rawData = spark.sparkContext.textFile("src/test/Resources/DataSets/Emp.txt")
val rowRD = rawData.map(line => line.split("-"))
val rowRDD = rowRD.map(r => Row(r(0).toInt, r(1), r(2).toInt, r(3))
)
// rowRDD.collect().foreach(println)
val schema = StructType(Array(
StructField(“id”, IntegerType, true),
StructField(“name”, StringType, true),
StructField(“age”, IntegerType, true),
StructField(“sal”, IntegerType, true)
))
val df = spark.createDataFrame(rowRDD, schema)
df.printSchema()
df.show()

1.执行上述代码时,会出现报错:

18/04/21 20:21:15 ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 2)
java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: java.lang.String is not a valid external type for schema of int
if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, id), IntegerType) AS id#0
± if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, id), IntegerType)
:- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt
: :- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object)
: : ± input[0, org.apache.spark.sql.Row, true]
: ± 0
:- null

2.分析出错的原因

val rowRDD = rowRD.map(r => Row(r(0).toInt, r(1), r(2).toInt, r(3))

上述代码的r(3)并未进行类型转换,所以仍是String类型,但后面schema中对应的类型已经是IntegerType,所以导致代码运行出错。

3.改正

val rowRDD = rowRD.map(r => Row(r(0).toInt, r(1), r(2).toInt, r(3).toInt)

总结

应该优先检查代码中是不是在类型转换处出错,以至于类型对应不起来。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 该错误信息提示在给定的架构类型int64上无效的Java对象,因为它强制将字符串类型的Java对象分配给字段。这通常意味着在使用int64类型的字段时,错误的Java对象被分配给该字段。这可能是由于字段类型与实际数据类型不匹配而导致的。为了解决此问题,您需要检查您的代码和架构定义,确认字段和类型之间的匹配是否正确。如果存在任何错误,请更正这些错误,并重新运行代码以确保不会再次出现此错误。您还可以查看其他可能存在的数据类型转换错误,以确保代码和架构定义之间的数据类型一致性。如果您不确定如何解决这个问题,请考虑查看Java文档,参考有关Java对象以及数据类型转换的文档。 ### 回答2: 这个错误信息是指在使用Java创建schema type int64的时候,将字符串类型的数据传入了该schema中。实际上,int64是一种整数类型,在Java中对应的是long类型,而非字符串类型。 通常,出现这种错误会导致程序无法运行或运行出现问题。为了解决这个错误,我们需要找到程序中出现这个错误的地方,然后检查传入数据的类型是否与该schema要求的类型一致。如果数据类型不一致,就需要对传入的数据进行类型转换,将其转换为正确的数据类型再传入该schema中。 此外,在编程时也应该尽量避免出现这种错误。我们可以使用编译器的类型检查功能来确保程序中不会出现类型不匹配的问题,或者在程序中添加相关的异常处理机制,当出现类型不匹配时能够及时抛出异常并给予提示。 总之,处理这个错误需要对程序中出现该错误的原因进行分析,并进行相应的调整和修改。只有在编程过程中注重细节,才能够避免出现这种类型不匹配的问题。 ### 回答3: 这个错误信息是Java语言中的一种错误提示。它由一个Java程序生成,提示开发者他们在尝试使用一个不正确的Java对象类型来赋值给一个int64类型的变量时,出现了一个错误。 Java中有很多基本数据类型,比如int、float、long等等。这些基本数据类型都具有不同的数据范围和取值范围。int64即为long类型,它能够表示的范围为-9223372036854775808到9223372036854775807。无效的Java对象是指一个没有被正确声明或定义的Java对象,或者一个Java对象类型与需要的int64类型不匹配的情况。 通常情况下,这种错误信息是由于变量名称或变量类型错误引起的。编程时需要遵循严格的变量类型规则,并确保所定义的变量被正确地赋值。对于这种错误,通常要检查代码,找到错误所在的语句,确认变量类型是否正确,并确认变量被正确地赋值。 如果遇到这种情况,在处理该错误之前,开发者应该尽可能了解Java语言中各种数据类型的特点和用法,以便更好地避免类似的错误。同时,使用工具来帮助发现和识别这种错误也是非常有帮助的。最后,进行充分的测试和验证,确保代码没有错误,并且符合预期的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值