在加入PairRDD时键入Mismatch异常

时间:2018-01-18 14:59:02

标签: scala apache-spark apache-spark-mllib

我使用的是Spark 2.0.2和Scala 2.11.8。我正在尝试将文本文件转换为Pair RDD并将其与另一对RDD连接。但是当我尝试加入它们时,我会遇到类型不匹配异常。以下是代码

val acc_ToSubAccIDKeyValPair = new PairRDDFunctions[String,String](sc.textFile(acc_ToSubAccID).map(x => x.split(",")).map(f=>(f(0),f(1)))) 

val acc_ToProductID = new PairRDDFunctions[String,String](retVal.flatMap(userToRating => userToRating._2).map(rating => (rating.user.toString,rating.product.toString)))

acc_ToSubAccIDKeyValPair.join(acc_ToProductID).values.saveAsTextFile(saveResultsPath)

编译后得到的例外情况:

[error]  found   : org.apache.spark.rdd.PairRDDFunctions[String,String]
[error]  required: org.apache.spark.rdd.RDD[(String, ?)]
[error]     acc_ToSubAccIDKeyValPair.join(acc_ToProductID).values.saveAsTextFile(saveResultsPath)
[error]                                   ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

我如何加入这2个RDD?

我尝试过标准方法,其中RDD被隐式转换为Pair RDD。但是当我尝试在hadoop集群上运行它时,这种方法在运行时给了我一个例外。我得到的例外是我加入RDD的行是:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.SparkContext$.rddToPairRDDFunctions(Lorg/apache/spark/rdd/RDD;Lscala/reflect/ClassTag;Lscala/reflect/ClassTag;Lscala/math/Ordering;)Lorg/apache/spark/rdd/PairRDDFunctions;

搜索这个异常,人们告诉我它可能是版本不匹配异常,但我的编译时和运行时环境是相同的。 因此,我试图制作Explicit PairRDD。

1 个答案:

答案 0 :(得分:1)

join期望参数类型为RDD[(K, V)],而不是PairRDDFunctions

一般来说 - 你不应该明确地实例化PairRDDFunctions - Scala会隐含地将左手RDD转换为PairRDDFunctions

val acc_ToSubAccIDKeyValPair = sc.textFile(acc_ToSubAccID).map(x => x.split(",")).map(f=>(f(0),f(1)))

val acc_ToProductID = retVal.flatMap(userToRating => userToRating._2).map(rating => (rating.user.toString,rating.product.toString))

acc_ToSubAccIDKeyValPair.join(acc_ToProductID).values.saveAsTextFile(saveResultsPath)