Scala调用Java方法时Spark Dataset类型不匹配如何解决?
问题原因
你遇到的类型不匹配问题是因为Java侧代码的Dataset参数使用了无泛型的原始类型,而Scala侧的Dataset默认携带泛型参数,编译期类型检查无法自动对齐两种类型。由于Java泛型采用类型擦除实现,运行时并不会校验泛型参数,只要在Scala侧做显式类型转换即可正常调用。
解决方案
直接对Dataset[ExceptionRecord]做原始类型强转即可,修改后的Scala代码如下:
val sampleDS = spark.sql("""select * from someTable""").as[ExceptionRecord] val sampleInsert = new SampleInsert // 显式强转为无泛型的原始Dataset类型 sampleInsert.runCode(sampleDS.asInstanceOf[org.apache.spark.sql.Dataset])
如果不想用强转,也可以通过转DataFrame的方式实现:
sampleInsert.runCode(sampleDS.toDF())
两种方案运行时都不会有额外开销,也不会影响业务逻辑,只要你的sampleDS的Schema符合Java方法的预期即可正常执行。
内容的提问来源于stack exchange,提问作者Sekar Ramu
相关产品推荐
相关产品推荐

