过滤左连接JavaRDD时,缺席(或存在)不能转换为可选异常

过滤左连接JavaRDD时,缺席(或存在)不能转换为可选异常,java,apache-spark,rdd,Java,Apache Spark,Rdd,我实际上是想用一个左外连接来“减法” JavaPairRDD<Integer, Integer> allCustomers = ... (customerID, 1) JavaPairRDD<Integer, Integer> excludedCustomers = ... (customerID, 1) JavaPairRDD<Integer, Tuple2<Integer, Optional<Integer>>> joinedCu

我实际上是想用一个左外连接来“减法”

JavaPairRDD<Integer, Integer> allCustomers = ... (customerID, 1)
JavaPairRDD<Integer, Integer> excludedCustomers = ... (customerID, 1)

JavaPairRDD<Integer, Tuple2<Integer, Optional<Integer>>> joinedCustomers = allCustomers.leftOuterJoin(excludedCustomers)

JavaPairRDD<Integer, Tuple2<Integer, Optional<Integer>>> filteredCustomers = joinedCustomers.filter(t -> !t._2._2.isPresent())

我尝试了其他解决方法,比如先映射和/或使用.orNull,但仍然会出现相同的错误

JavaPairRDD<Integer, Boolean> joinedCustomersBoolean = joinedCustomers.mapValues(t -> t._2.orNull() == null);
javapairdd joinedCustomersBoolean=joinedCustomers.mapValues(t->t._2.orNull()==null);

最后,但并非最不重要的一点是,设置
spark.driver.userClassPathFirst=true不能解决此问题。

请检查运行时类路径中是否没有不同版本的guava库。番石榴可以来自:spark(预捆绑)、you代码、hadoop类路径(如果您使用它/添加它)。一般来说,您有两个选择:或者将您的版本降级到spark使用的版本(这是最简单的)。或者你应该准备uber jar,并将你的番石榴版本重新打包到不同的包中(参见maven shade插件)。如果没有额外的信息,有点难以确定确切的原因

java.lang.ClassCastException: com.google.common.base.Absent cannot be cast to com.google.common.base.Optional
JavaPairRDD<Integer, Boolean> joinedCustomersBoolean = joinedCustomers.mapValues(t -> t._2.orNull() == null);