需要像“def groupByKeyWithRDD(partitioner:Partitioner):RDD [(K,RDD [V])] = ???”

时间:2015-11-14 09:09:14

标签: apache-spark rdd

在我们使用groupByKey(...):RDD [(K,Iterable [V]]的用例中,可能存在即使对于单个键(尽管是极端情况),相关的Iterable [ V]可能导致OOM。

是否可以提供上述'groupByKeyWithRDD'?

理想情况下,如果RDD [V]的内部impl足够智能,只能在配置的阈值上将数据溢出到磁盘中,那就太棒了。这样,我们也不会牺牲正常情况下的表现。

欢迎任何建议/意见。非常感谢!

只是旁注:我们理解这里提到的要点:https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html,'reduceByKey','foldByKey'现在不太适合我们的需求,也就是说,我们不能真的避免'groupByKey'。

1 个答案:

答案 0 :(得分:2)

假设#(of-unique-keys)<< #(键值对),似乎是这种情况,不需要RDD[(K, RDD[V])]。相反,您可以通过使用过滤器映射唯一键来转换为Map[(K, RDD[V])]

import scala.reflect.ClassTag
import org.apache.spark.rdd.RDD

def splitByKey[K : ClassTag, V: ClassTag](rdd: RDD[(K, V)]): Map[K, RDD[V]] = {
  val keys = rdd.keys.distinct.collect.toSeq
  keys.map(key => (key -> rdd.filter{case (k, _) => k == key}.values)).toMap
}

它需要对数据进行多次扫描,因此它不是很便宜,但不需要改组,可以更好地控制缓存,只要初始RDD适合内存,就不太可能导致OOM。