Spark 催化剂优化器强制转换异常
Posted
技术标签:
【中文标题】Spark 催化剂优化器强制转换异常【英文标题】:Spark catalyst optimizer cast exception 【发布时间】:2018-01-31 11:39:33 【问题描述】:我有 2 个(Foo
和 Bar
)类,每个类都实现一个接口。
应用程序具有检查接口对象的某些条件的方法。
private boolean check(Interface1 obj)
我将此方法应用于两个类:
Dataset<Foo> foos = getStapSession()....load().as(Encoders.bean(Foo.class));
Dataset<Bar> bars = getStapSession()....load().as(Encoders.bean(Bar.class));
foos.filter((FilterFunction<Foo>) this::check).collectAsList();
bars.filter((FilterFunction<Bar>) this::check).collectAsList();
有一个转换错误(!!!):
Caused by: java.lang.ClassCastException: test.Bar cannot be cast to test.Foo
at org.apache.spark.sql.catalyst.optimizer.CombineTypedFilters$$anonfun$org$apache$spark$sql$catalyst$optimizer$CombineTypedFilters$$combineFilterFunction$1.apply(objects.scala:85)
at org.apache.spark.sql.catalyst.optimizer.CombineTypedFilters$$anonfun$org$apache$spark$sql$catalyst$optimizer$CombineTypedFilters$$combineFilterFunction$1.apply(objects.scala:85)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(generated.java:273)
....
有不同的类具有不同的属性等。 数据集的创建是不同的。 (几个 src 文件)。
编辑:
.filter((FilterFunction<Foo>)obj -> check(obj))
和
.filter((FilterFunction<Bar>)obj -> check(obj))
工作正常。与方法参考有关的一些问题
this::check
【问题讨论】:
【参考方案1】:这不是 Spark 的错误,它是 a bug of JDK deserialization (BUG ID: 8154236),lambda 的反序列化会导致 ClassCastException。 你可以在Spark Issues (SPARK-9135)看到这个问题的类似问题描述。
【讨论】:
以上是关于Spark 催化剂优化器强制转换异常的主要内容,如果未能解决你的问题,请参考以下文章