Spark 催化剂优化器强制转换异常

Posted

技术标签:

【中文标题】Spark 催化剂优化器强制转换异常【英文标题】:Spark catalyst optimizer cast exception 【发布时间】:2018-01-31 11:39:33 【问题描述】:

我有 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】:

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

【讨论】:

以上是关于Spark 催化剂优化器强制转换异常的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL:array_contains 和自动插入的强制转换

PriorityQueue 抛出类强制转换异常

Java 类强制转换异常 - 春季启动

java的异常体系

C# 的无效强制转换异常

Spark SQL Java GenericRowWithSchema无法强制转换为java.lang.String