假设我有一个RDDInt。在我通过某个鉴别器函数执行groupBy之后,我得到了一个RDD[(Int,IterableInt)]。
由于此Iterable可以很大,因此它应该分布在节点之间。但是没有办法像RDD那样处理它。
例如,如果我想进一步通过键与其中一个Iterable进行配对和聚合。
或者,假设我想对其中一个进行排序,并找到median
我认为在这里调用.toList或.toSeq方法是不合法的,因为常规的scala集合不是分布式的。
那么处理Iterables的正确方法是什么呢?
发布于 2017-03-26 05:24:39
几乎可以肯定的是,您不想做groupBy。Spark作业中最大的性能问题之一是由于糟糕的分区和数据局部性而导致的数据在集群中的打乱。如果您正在执行groupBy,那么您可能希望在该键上对数据进行分区,并使数据尽可能地彼此靠近。因此,最后,一个groupBy表明,如果可以避免,您实际上不希望将数据分散到分区之外。
但你想要的东西需要更多的分布式。您可能想要这样做:
val rdd: RDD[Int] = ...
val rdd2: RDD[(Int, Int)] = rdd.map(i => (key(i), i))
val rdd3: RDD[(Int, Int)] = rdd2.reduceByKey((accumulator, i) => myFunction(accumulator, i))发布于 2017-03-26 05:05:31
您可以使用aggregateByKey或reduceByKey transformations,为了获得结果,您可以使用actions,如collect
https://stackoverflow.com/questions/43021104
复制相似问题