我有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
答案 0 :(得分:0)
这不是Spark的错误,而是a bug of JDK deserialization (BUG ID: 8154236),反序列化lambda会导致ClassCastException。 您可以在Spark Issues (SPARK-9135)中看到与此问题类似的问题描述。