假设我有一个RDD [Int]。在我通过一些鉴别器函数执行groupBy后,我留下了RDD [(Int,Iterable [Int])]。
由于此Iterable可能很大,因此应该在节点之间分配。但是没有办法像RDD那样处理它。
例如,如果我想进一步做一些配对,并通过密钥与其中一个Iterables进行聚合。
或者让我说我想对其中一个进行排序并找到median
我认为在这里调用.toList或.toSeq方法之一是不合法的,因为常规的scala集合不是分布式的。
那么处理Iterables的正确方法是什么?
答案 0 :(得分:1)
你几乎肯定不想做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))
答案 1 :(得分:0)
您可以使用aggregateByKey或reduceByKey CMAKE_BUILD_TYPE not being used in CMakeLists.txt,为了获得结果,您可以使用transformations之类的收集