在我们使用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'。
答案 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。