通过键"内部"分区进行高效分组

Oph*_*tan 2 jdbc apache-spark

我正在努力使一个过程适应火花.基本上,该过程分析来自JDBC数据源的批量数据,每个记录具有batchId,还有更高级别的groupId.

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

  • 组数是~100.

  • 每批的记录数可以放在RAM中.

实际的分析代码并不重要,但它不适合reduceByKey或combineByKey的更具体的模型

我的想法是:

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

  • 使用group by batchId来准备数据

  • 使用map来应用业务逻辑.

瓶颈似乎是groupByKey,根据我的理解,它会强制进行洗牌(将数据写入磁盘) - 即使每个批次都包含在一个分区中.

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

有没有办法在分区内按键执行分组?还有其他可能的办法吗

Sea*_*wen 8

是的,您需要使用mapPartitions.您可以访问分区中所有记录的Iterator.您只是从那里编写Scala代码并可以执行您喜欢的操作,包括为记录构建批处理ID映射.记住,这必须适合记忆,但如果重要的话,你总是可以减少分区大小.