Jdbc “按键高效分组”;内;分割

Jdbc “按键高效分组”;内;分割,jdbc,apache-spark,Jdbc,Apache Spark,我正在尝试调整一个流程来激发灵感。 基本上,流程分析来自JDBC数据源的成批数据 每个记录都有一个batchId,还有一个更高级别的groupId 批次数量大(事先未知) 组数约为100 每批记录的数量可以放入RAM中 实际的分析代码并不重要,但它不适合更具体的reduceByKey或combineByKey模型 我的想法是: 使用jdbcRdd读取数据,使用“组id”进行分区 使用group by batchId准备数据 使用map应用业务逻辑 瓶颈似乎是groupByKey,据我所知

我正在尝试调整一个流程来激发灵感。 基本上,流程分析来自JDBC数据源的成批数据 每个记录都有一个batchId,还有一个更高级别的groupId

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

  • 组数约为100

  • 每批记录的数量可以放入RAM中

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

我的想法是:

  • 使用jdbcRdd读取数据,使用“组id”进行分区

  • 使用group by batchId准备数据

  • 使用map应用业务逻辑

瓶颈似乎是groupByKey,据我所知,它将强制执行洗牌(将数据写入磁盘)——即使每个批都包含在单个分区中

另一种可能的方法是使用batchId进行分区,但这将创建大量分区,从而产生大量查询

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

是的,您需要使用mapPartitions。您可以访问分区中所有记录的迭代器。您只需从那里编写Scala代码,就可以做您喜欢做的事情,包括构建批处理ID到记录的映射。记住,这必须适合内存,但如果这很重要的话,您总是可以减少分区大小

使用
RDD
上的
mapPartitions()
方法,您几乎可以在每个分区的基础上执行任何操作——您只需提供一个函数,该函数对分区数据使用迭代器,并对结果数据返回迭代器,迭代器的类型可能不同。您可以通过一个映射进行分组,在处理完所有输入后,将映射发送回。