Spark Structured Streaming - 按分区单独分组

Spark Structured Streaming - groupByKey individually by partition

我的 Kafka 生产者正在根据给定的键将消息分发到主题分区中。

因此,在 Spark 端,我已经在同一分区中拥有需要一起处理的消息。

现在,我需要执行 groupByKey 以在每个分区中将值按键聚合到列表中,但不需要合并分区,因为给定的键不可能出现在多个分区中。

如何仅在分区级别执行此 groupByKey?

|topic-partition1| ---> |spark-partition1| -- groupByKey --> |spark-partition1.1| -- mapGroupsWithState --> ...
|topic-partition2| ---> |spark-partition2| -- groupByKey --> |spark-partition2.1| -- mapGroupsWithState --> ...
|topic-partition3| ---> |spark-partition3| -- groupByKey --> |spark-partition3.1| -- mapGroupsWithState --> ...

如果您知道所有事件都将进入给定分区,您可以在数据集上使用 DataSet.mapPartitions

val dataSet: DataSet[(String, String)] = ???
dataSet.mapPartitions { iter =>
  val res: Map[String, List[(String, String)] =
    iter.toList.groupBy { case (key, _) => key }

  // Do additional processing on res, which is now grouped by each key
  // present in the partition.
}

否则,如果您需要 mapGroupsWithState,可以避免使用 groupByKey,因为您需要 KeyValueGroupedDataset[K, V]

如果您担心性能,请不要担心,除非您在分析时发现这是一个瓶颈。