我的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 --> ...
答案 0 :(得分:1)
如果您知道所有事件都将出现在给定分区中,则可以对数据集使用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]
。
如果你担心表现,除非你在分析时发现这是一个瓶颈,否则不要这样做。