【发布时间】:2014-09-28 19:50:39
【问题描述】:
我正在尝试调整流程以激发火花。 基本上,该过程分析来自 JDBC 数据源的批量数据 每条记录都有一个batchId,还有一个更高级别的groupId。
批次数量很大(预先未知)。
组数约为 100。
每个批次的记录数可以容纳在 RAM 中。
实际分析代码无所谓,但不适合reduceByKey或combineByKey等更具体的模型
我的想法是:
使用jdbcRdd读取数据,使用“group id”进行分区
使用 group by batchId 准备数据
使用地图应用业务逻辑。
瓶颈似乎是 groupByKey,据我了解,这将强制进行洗牌(将数据写入磁盘) - 即使每个批次都包含在单个分区中。
另一种可能的方法是使用 batchId 进行分区,但这会创建大量的分区 - 因此会产生大量的查询
有没有办法在分区内按键执行分组? 还有其他可能的方法吗?
【问题讨论】:
-
您几乎可以使用
RDD上的mapPartitions()方法对每个分区执行任何操作——您只需提供一个函数,该函数对分区数据进行迭代并在结果中返回一个迭代器数据,可以是不同的类型。您可以通过地图进行分组,当您处理完所有输入后将其发回。
标签: jdbc apache-spark