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]
。
如果您担心性能,请不要担心,除非您在分析时发现这是一个瓶颈。
我的 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]
。
如果您担心性能,请不要担心,除非您在分析时发现这是一个瓶颈。