关于jdbc:通过关键的”内部”分区进行有效分组

Efficient grouping by key “within” partitions

我正在尝试调整一个过程以激发灵感。
基本上,该过程分析来自JDBC数据源的成批数据
每个记录都有一个batchId,还有一个更高级别的groupId。

  • 批次数量很大(事先未知)。

  • 组的数量是?100。

  • 每个批次的记录数可以容纳在RAM中。

实际的分析代码无关紧要,但不适合reduceByKey或CombineByKey的更具体模型

我的想法是:

  • 使用jdbcRdd读取数据,使用" group id "进行分区

  • 使用batchId分组以准备数据

  • 使用映射来应用业务逻辑。

瓶颈似乎是groupByKey,据我所知,即使每批都包含在一个分区中,它也会强制进行随机播放(将数据写入磁盘)。

另一种可能的方法是使用batchId进行分区,但这将创建大量的分区-因此会有大量的查询

有没有一种方法可以在分区内按组进行分组?
还有其他可能的方法吗?


是的,您需要使用mapPartitions。您可以访问分区中所有记录的迭代器。您只是从那里编写Scala代码,就可以做自己喜欢的事情,包括建立一个批ID映射到记录。请记住,这必须适合内存,但是如果需要的话,您始终可以减小分区的大小。