通过密钥""内的高效分组分区

时间:2014-09-28 19:50:40

标签: jdbc apache-spark

我试图让一个过程适应火花。 基本上,该过程分析来自JDBC数据源的批量数据 每条记录都有一个batchId,也有一个更高级别的groupId。

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

  • 组数约为100。

  • 每个批次的记录数量可以放在RAM中。

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

我的想法是:

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

  • 使用group by batchId来准备数据

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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