这是一个新手问题。
是否可以将带有动态维度的(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(键,值),必须连接并且必须将其值相加。有没有比我想的更好的方式?
答案 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,您将不得不考虑性能)。