我试图让一个过程适应火花。 基本上,该过程分析来自JDBC数据源的批量数据 每条记录都有一个batchId,也有一个更高级别的groupId。
批次数量很大(事先未知)。
组数约为100。
每个批次的记录数量可以放在RAM中。
实际的分析代码并不重要,但它不适合reduceByKey或combineByKey的更具体的模型
我的想法是:
使用jdbcRdd读取数据,使用" group id"用于分区
使用group by batchId来准备数据
使用map来应用业务逻辑。
瓶颈似乎是groupByKey,根据我的理解,这将强制进行洗牌(将数据写入磁盘) - 即使每个批次都包含在一个分区中。
另一种可能的方法是使用batchId进行分区,但这会创建大量的分区 - 因此会有大量的查询
是否有办法在分区内按键执行分组? 还有其他可能的方法吗?
答案 0 :(得分:8)
是的,您需要使用mapPartitions。您可以访问分区中所有记录的Iterator。您只是从那里编写Scala代码并可以执行您喜欢的操作,包括为记录构建批处理ID映射。记住,这必须适合记忆,但如果重要的话,你总是可以减少分区大小。