我有(Key,Value)类型的dstream。
mapped2.foreachRDD(rdd => {
rdd.foreachPartition(p => {
p.foreach(x => {
}
)})
})
我需要确保所有具有相同键的项目都在一个分区和一个核心处理。所以实际上有顺序处理..
怎么做?我可以使用效率低下的GroupBykey吗?
答案 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
。