首先,如果您想简单地对除第一个以外的所有整数求和,最简单的方法是:
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))
但在你的情况下,这似乎有点过头了。
我想补充一件事,这看起来像是一个可疑的设计,将关键字作为rdd的第一个元素。为什么不在驱动程序中使用成对的(key, rdd)呢?很难推断出rdd中元素的顺序,我不能不考虑到当关键字被计算为rdd的第一个元素时的自然情况(当然,我不知道你的用例,所以我只能猜测)。
编辑
如果你有一个键值对的rdd,并且想按键值进行求和,则只需执行以下操作:
val result = rdd.reduceByKey(_ + _)
如果在计数之前有许多键值对的RDD,您只需将它们加起来即可。
val list = List(pairRDD0, pairRDD1, pairRDD2)
val newList = anotherPairRDD0::list
val pairRDD = newList.reduce(_ union _)
val resultSoFar = pairRDD.reduceByKey(_ + _)
val result = resultSoFar.union(anotherPairRDD1).reduceByKey(_ + _)
编辑
我编辑了一个示例。正如您所看到的,当每次在运行时出现时,您可以添加额外的rdd。这是因为reduceByKey返回相同类型的rdd,因此您可以迭代此操作(当然,您需要考虑性能)。