我试图通过比较给定的属性来实现一个负责返回两个RDD交集的函数。
def intersect[T](left: RDD[Article], right: RDD[Article])(by: Article => (T,Article)) = {
val a: RDD[(T, Article)] = left.map(by)
val b: RDD[(T, Article)] = right.map(by)
a.join(b).map { case (attr, (leftItem, rightItem)) => leftItem }
}
但是,在编译期间,sbt会抛出以下错误:
Error:(128, 7) value join is not a member of org.apache.spark.rdd.RDD[(T, org.example.Article)]
a.join(b).map { case (attr, (leftItem, rightItem)) => leftItem }
^
如果我对类型进行硬编码,一切都很顺利。知道为什么我有这个错误吗?
更新
似乎scala无法从RDD [(T,Article)]到PairRDDFunctions [K,V]进行隐式转换,但我不知道为什么。
更新
如果我修改这样的代码:
def intersect[T](left: RDD[Article], right: RDD[Article])(by: Article => (T,Article)) = {
val a: PairRDDFunctions[T, Article] = left.map(by)
val b: RDD[(T, Article)] = right.map(by)
a.join(b).map { case (attr, (leftItem, rightItem)) => leftItem }
}
我收到另一个错误:
[error] No ClassTag available for T
[error] val a: PairRDDFunctions[T, Article] = left.map(by)
答案 0 :(得分:1)
此外,为了完成代码片段,还需要包含以下内容,以便包括PairedRdds:
import org.apache.spark.SparkContext._
或者你可以写:
def intersect[T](left: RDD[Article], right: RDD[Article])(by: Article => (T,Article))
(implicit kt: ClassTag[T]) = {
...
}