DStream应按顺序处理所有相同的键

时间:2016-12-08 05:49:24

标签: scala apache-spark spark-streaming

我有(Key,Value)类型的dstream。

mapped2.foreachRDD(rdd => {
  rdd.foreachPartition(p => {
    p.foreach(x => {
    }
  )})
})

我需要确保所有具有相同键的项目都在一个分区和一个核心处理。所以实际上有顺序处理..

怎么做?我可以使用效率低下的GroupBykey吗?

1 个答案:

答案 0 :(得分:1)

您可以使用PairDStreamFunctions.combineByKey

import org.apache.spark.HashPartitioner
import org.apache.spark.streaming.dstream.DStream
/**
  * Created by Yuval.Itzchakov on 29/11/2016.
  */
object GroupingDStream {
  def main(args: Array[String]): Unit = {
    val pairs: DStream[(String, String)] = ???
    val numberOfPartitions: Int = ???

    val groupedByIds: DStream[(String, List[String])] = pairs.combineByKey[List[String]](
      _ => List[String](), 
      (strings: List[String], s: String) => s +: strings, 
      (first: List[String], second: List[String]) => first ++ second, new HashPartitioner(numberOfPartitions))

    groupedByIds.foreachRDD(rdd => {
      rdd.foreach((kvp: (String, List[String])) => {

      })
    })
  }
}

combineByKey的结果将是一个元组,第一个元素是键,第二个元素是值的集合。注意我使用(String, String)是为了简化示例,因为您还没有提供任何类型。

然后,使用foreach迭代值列表并在需要时按顺序处理它们。请注意,如果您需要应用其他转换,则可以使用DStream.map并对第二个元素(值列表)进行操作,而不是使用foreachRDD