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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值