如何在火花中结束两个rdd

时间:2016-11-12 06:09:01

标签: apache-spark pyspark

rdd_1 = [(k1, (v1, v2)), (k2, (v3, v4, v5))]
rdd_2 = [(v1, (w1)), (v3, (w2, w3)), (v5, (w4))]

我希望获得一个像rdd = [(k1, (w1)), (k2, (w2, w3, w4))]

这样的新rdd

如何使用python在spark中执行此操作?

2 个答案:

答案 0 :(得分:2)

flatMapjoingroupByKey应该完成这项工作(按此顺序使用)。

答案 1 :(得分:0)

这是Scala中的完整工作代码。这段代码基本上使用了三个转换flatMap,join和groupBy。这里的问题是join和groupBy键必须不同。首先,我们在rdd_1上使用flatMap来获得(v,k)类型的rdd。现在我们有类型(v,k)和(v,List(w))的rdds,所以我们基于 v 进行连接。我们加入的rdd的类型将是(v,(k,List(w)))。最后,我们通过传递函数 x =>来分组 K x._2._1 到groupBy转换。以下是整个代码: - >

val rdd1 = sc.parallelize(Seq(("k1", List("v1", "v2")), ("k2", List("v3", "v4", "v5"))))
val rdd2 = sc.parallelize(Seq(("v1", List("w1")), ("v3", List("w2", "w3")), ("v5", List("w4"))))
val flattenedRdd1 = rdd1 flatMap {
  case (x, y) => {
    val lb = new ListBuffer[(String, String)]
    y.foreach { v => lb += ((v, x)) }
    lb
  }
}
val joined = flattenedRdd1 join rdd2
val result = joined.groupBy { x => x._2._1 }.map {
  case (x, itr) => {
    val lb = new ListBuffer[String]
    itr.foreach {
      case (f, s) => {
        lb.++=(s._2)
      }
    }
    (x, lb)
  }
}
result.foreach(println(_)).