将rdd转换为pairRDD
Posted
技术标签:
【中文标题】将rdd转换为pairRDD【英文标题】:transform rdd into pairRDD 【发布时间】:2015-05-28 13:26:50 【问题描述】:这是一个新手问题。
是否可以将像(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(键,值),它们必须被连接并且它们的值必须相加。有没有比我想的更好的方法?
【问题讨论】:
是 scala 元组类型的元素吗? 目前它们只是整数,我正在考虑将它们收集在一个元组中,是的,除非你有更好的想法。我愿意讨论 我想我不明白。你想用一个元素获得 rdd,包含你的 rdd 的一对第一个元素作为键,其余作为值吗? 我想获得一个pairRDD,其中第一个元素是起始RDD的第一个元素,第二个元素是原始RDD中除第一个元素之外的所有内容的元组。现在清楚了吗? 是的,但这不可行。如果这样做,您将在一个节点上收集除一个之外的所有 rdd 元素。而且它可能会因为缺乏记忆而崩溃(如果你的 rdd 很大)。 【参考方案1】:首先,如果您只想对所有整数求和,但首先最简单的方法是:
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))
但在你的情况下,这感觉有点矫枉过正。
我还要补充一点,将 key 作为 rdd 的第一个元素似乎是有问题的。为什么不在你的驱动程序中使用pairs (key, rdd)。很难推断 rdd 中元素的顺序,我不能不考虑女巫键中的自然情况被计算为 rdd 的第一个元素(我不知道你的用例,所以我只能猜测)。
编辑
如果您有一个 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。这是因为 reduceByKey 返回相同类型的 rdd,因此您可以迭代此操作(Ofc 您将不得不考虑性能)。
【讨论】:
感谢您的帮助。根据你的解释我编辑了这个问题,你有什么更好的建议吗? 您的回答非常有帮助,但问题是我在编译时不知道pairedRDD 的数量,因此不可能像您那样编写val 列表。有没有办法做到这一点?以上是关于将rdd转换为pairRDD的主要内容,如果未能解决你的问题,请参考以下文章