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