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