过滤左连接JavaRDD时,Absent(或Present)不能转换为Optional异常

问题描述 投票:0回答:2

我本质上是尝试使用左外连接来“减去”。

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())

但我收到错误

java.lang.ClassCastException: com.google.common.base.Present cannot be cast to com.google.common.base.Optional

java.lang.ClassCastException: com.google.common.base.Absent cannot be cast to com.google.common.base.Optional

我尝试了其他解决方法,例如首先映射和/或使用 .orNull,但我仍然遇到相同的错误。

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

最后但并非最不重要的一点是,设置

spark.driver.userClassPathFirst = true
并不能解决问题。

java apache-spark rdd
2个回答
0
投票

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


0
投票

如果您只是尝试执行左反连接以从所有客户中删除排除的客户,则可以改为

allCustomers.substractByKey(excludedCustomers)

© www.soinside.com 2019 - 2024. All rights reserved.