Spark:使用通用RDD的连接方法

时间:2015-08-13 17:23:09

标签: scala apache-spark

我试图通过比较给定的属性来实现一个负责返回两个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)

1 个答案:

答案 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]) = {
    ...
      }