将 Apache Spark 从版本 3.2.1 升级到 3.4.1 后,我遇到了与类型转换相关的运行时错误。此错误在以前的版本中没有发生过。具体来说,是 java.lang。
将 Apache Spark 从版本 3.2.1 升级到 3.4.1 后,我遇到了与类型转换相关的运行时错误。此错误在以前的版本中没有发生。具体来说,在自定义案例类上使用 Dataset.reduce() 时会抛出 java.lang.ClassCastException。以下是重现此问题的代码的简化版本:
case class CustomCaseClass(id: String, body: Map[String, Int])
val result = someDataset
.groupByKey(ds => ds.id)(Encoders.STRING)
.mapGroups((key, iter) => CustomCaseClass(key, Map(key -> iter.length)))(Encoders.product)
.reduce((before, next) => before.copy(body = before.body ++ next.body))
执行此代码时,出现以下错误:
class threw exception: java.lang.ClassCastException: CustomCaseClass cannot be cast to CustomCaseClass
这个错误令人费解,因为它试图将 CustomCaseClass 转换为自身。我尝试了以下方法,但问题仍然存在:
使用显式编码器禁用 AQE(自适应查询执行)
问题:
在 Spark 3.4.1 中什么原因导致此 ClassCastException?
我是否应该修改某些特定的序列化器选项?
我是否应该使用更精确的 Encoder 而不是 Encoders.product?如果是,该怎么做?
Spark 3.4.1 中是否存在任何已知问题或变化可能会导致这种情况?
我应该修复什么才能解决此错误?
任何见解或解决方案都将不胜感激。谢谢!
环境:
Spark版本:3.4.1Scala版本:2.12.17Jvm:1.8.0.341