在Spark中对每个分区进行一次哈希

时间:2016-05-05 17:14:11

标签: scala apache-spark

我有RDD[Things],其中Things是包含多个字段的案例类(但没有自定义方法。)我需要在Things.foo_id上运行昂贵的操作。每个foo_id出现数千次,所以我不想在每一行上运行哈希。

一种显而易见的方法是通过例如

进行分组
val stuff: RDD[Things]
stuff.groupBy(_.foo_id).flatMap(expensive_operation)

但是,跨分区对数据进行分组也很昂贵,而且我并不需要在全局范围内按foo_id进行分组 - 每个分区执行此操作一次就足够了。每个分区foo_id是否有一种运行此操作的好方法?

修改:我已使用以下代码尝试mapPartitions

val stuff: RDD[Things]
val grouped = stuff.mapPartitions(it => it.toList.groupBy(_.foo_id))
grouped.flatMap(expensive_operation)

但是即使在相对较小的数据集上也会遇到内存不足错误,可能是因为列表已加载到内存中。我无法找到一种方法来对迭代器进行分组,而无需将整个内容加载到内存中。

0 个答案:

没有答案