我有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)
任何帮助都会很棒!
答案 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(_ ++ _)