将rdd转换为pairRDD

时间:2015-05-28 13:26:51

标签: scala apache-spark

这是一个新手问题。

是否可以将带有动态维度的(key,1,2,3,4,5,5,666,789,...) RDD转换为(key, (1,2,3,4,5,5,666,789,...))之类的pairRDD?

我觉得它应该超级容易,但我无法理解。

这样做的目的是我想要总结所有的值,而不是关键。

感谢任何帮助。

我正在使用Spark 1.2.0

编辑在答案的启发下我更深入地解释了我的用例。我有N(编译时未知)不同的pairRDD(键,值),必须连接并且必须将其值相加。有没有比我想的更好的方式?

1 个答案:

答案 0 :(得分:2)

首先,如果你只想求所有整数,但首先最简单的方法是:

val rdd = sc.parallelize(List(1, 2, 3))
rdd.cache()
val first = rdd.sum()
val result = rdd.count - first

另一方面,如果您想要访问元素索引,可以使用rdd zipWithIndex方法,如下所示:

  val indexed = rdd.zipWithIndex()
  indexed.cache()
  val result = (indexed.first()._2, indexed.filter(_._1 != 1))

但在你的情况下,这感觉就像是矫枉过正。

我要添加的另一件事,这看起来像是有问题的desine将key作为你的rdd的第一个元素。为什么不在驱动程序中使用对(key,rdd)。很难理解rdd中的元素顺序,我不能不考虑女巫键中的自然情况被计算为rdd的第一个元素(ofc我不知道你的用例,所以我只能猜测)。

修改

如果您有一个关键值对的rdd并且您想要按键求和它们,那么只需:

val result = rdd.reduceByKey(_ + _)

如果你在计算之前有很多关键值对的rdds你可以总结一下

  val list = List(pairRDD0, pairRDD1, pairRDD2)
  //another pairRDD arives in runtime
  val newList = anotherPairRDD0::list
  val pairRDD = newList.reduce(_ union _)
  val resultSoFar = pairRDD.reduceByKey(_ + _)
  //another pairRDD arives in runtime
  val result = resultSoFar.union(anotherPairRDD1).reduceByKey(_ + _)

修改

我编辑了例子。如您所见,您可以在运行时出现每个rdd时添加其他rdd。这是因为reduceByKey返回相同类型的rdd,因此您可以迭代此操作(Ofc,您将不得不考虑性能)。