Spark Structured Streaming - groupByKey分别按分区

时间:2018-01-23 12:18:30

标签: apache-spark spark-structured-streaming

我的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 --> ...

1 个答案:

答案 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]

如果你担心表现,除非你在分析时发现这是一个瓶颈,否则不要这样做。