2016-03-31 4 views
0

Ich versuche im Wesentlichen zu "subtrahieren" stattdessen mit einem linken äußeren Join.Beim Filtern einer linken Join JavaRDD, kann Abwesend (oder Present) nicht in Optionale Ausnahme

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

Aber ich bekomme die Fehler

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

und

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

ich andere Abhilfen versucht, wie Mapping erste und/oder .orNull, aber ich immer noch die gleichen Fehler.

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

Last, but not least, spark.driver.userClassPathFirst = true Einstellung löst das Problem nicht.

Antwort

0

Bitte überprüfen Sie, ob Sie verschiedene Versionen der Guava-Bibliothek in Ihrem Laufzeitklassenpfad haben. Guava kann kommen von: funken (vorgebündelt), du Code, hadoop classpath (wenn du es benutzt/füge es hinzu). Im Allgemeinen haben Sie zwei Möglichkeiten: Entweder downgraden Sie Ihre Version auf die Version, die Spark verwendet (das ist am einfachsten). Oder Sie sollten Uber-Glas vorbereiten & verpacken Sie Ihre Guave-Version in verschiedene Paket (siehe maven Schatten-Plugin). Ein bisschen schwer zu sagen ohne zusätzliche Informationen, was die genaue Ursache ist.