按“内部”分区键进行有效分组

Posted

技术标签:

【中文标题】按“内部”分区键进行有效分组【英文标题】:Efficient grouping by key "within" partitions 【发布时间】:2014-09-28 19:50:39 【问题描述】:

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

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

组数约为 100。

每个批次的记录数可以容纳在 RAM 中。

实际分析代码无所谓,但不适合reduceByKey或combineByKey等更具体的模型

我的想法是:

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

使用 group by batchId 准备数据

使用地图应用业务逻辑。

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

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

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

【问题讨论】:

您几乎可以使用RDD 上的mapPartitions() 方法对每个分区执行任何操作——您只需提供一个函数,该函数对分区数据进行迭代并在结果中返回一个迭代器数据,可以是不同的类型。您可以通过地图进行分组,当您处理完所有输入后将其发回。 【参考方案1】:

是的,您需要使用 mapPartitions。您可以访问分区中所有记录的迭代器。您只是从那里编写 Scala 代码,并且可以做您喜欢做的事情,包括建立一个批次 ID 到记录的 Map。请注意,这必须适合内存,但如果这很重要,您始终可以减小分区大小。

【讨论】:

以上是关于按“内部”分区键进行有效分组的主要内容,如果未能解决你的问题,请参考以下文章

有效地对重叠的矩形进行分组

SQL:按结果分组的有效方法,包括所有表列

更有效的方法:按变量分组的许多列的 value_counts (in %)

Spark 按 Key 分组并对数据进行分区

分组,计数,然后排序的最有效方法?

对对象数组进行分组的最有效方法