我使用的是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。
答案 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)