如何通过键连接两个RDD来获取(String,String)的RDD?

时间:2015-08-31 00:09:30

标签: scala apache-spark

我有RDD [(String,mutable.HashSet [String])形式的两个配对的rdds:

例如:

rdd1: 332101231222, "320758, 320762, 320760, 320759, 320757, 320761"
rdd2: 332101231222, "220758, 220762, 220760, 220759, 220757, 220761"

我想基于公共密钥组合rdd1和rdd2,所以o / p应该是这样的: 332101231222 320758,320762,320760,320759,320757,320761 220758,220762,220760,220759,220757,220761

这是我的代码:

def cogroupTest (rdd1: RDD [(String, mutable.HashSet[String])], rdd2: RDD [(String, mutable.HashSet[String])] ): Unit =
{

val prods_per_user_co_grouped = (rdd1).cogroup(rdd2)

prods_per_user_co_grouped.map { case (key: String, (value1: mutable.HashSet[String], value2:  mutable.HashSet[String])) => {
 val combinedhs = value1 ++ value2
 val sstr =  combinedhs.mkString("\t")
 val keypadded = key + "\t"
  s"$keypadded$sstr"
}
}.saveAsTextFile("/scratch/rdds_joined/")

以下是运行我的程序时出现的错误:

  

scala.MatchError:(32101231222,(CompactBuffer(Set(320758,320762,320760,320759,320757,320761)),CompactBuffer(Set(220758,220762,220760,220759,220757,220761))))(的) class scala.Tuple2)

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

正如您可能从名称cogroup中猜出的那样,按键分组观察。这意味着在你的情况下你得到:

(String, (Iterable[mutable.HashSet[String]], Iterable[mutable.HashSet[String]]))

不是

(String, (mutable.HashSet[String], mutable.HashSet[String]))

当你看到你得到的错误时,很清楚。如果要组合对,则应使用join方法。如果不是,你应该调整模式以匹配你得到的结构,然后使用这样的东西:

val combinedhs = value1.reduce(_ ++ _) ++ value2.reduce(_ ++ _)