Spark催化剂优化器抛出异常

时间:2018-01-31 11:39:33

标签: java apache-spark apache-spark-sql

我有2个(FooBar)类,每个类实现一个接口。

应用程序具有检查接口对象的某些条件的方法。

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 个答案:

答案 0 :(得分:0)

这不是Spark的错误,而是a bug of JDK deserialization (BUG ID: 8154236),反序列化lambda会导致ClassCastException。 您可以在Spark Issues (SPARK-9135)中看到与此问题类似的问题描述。