输入1:KV数据流。

输入1:KV数据流。
如果我理解正确:
为此,最好的策略是对传入RDD和静态RDD使用 join操作,两个RDD使用相同的分区器进行分区。如果其中一个数据RDD比另一个小得多,您可以探索广播较小的数据RDD。我最近在我的项目中尝试了这一点,并在post中分享了经验:加入RDD的随机分区行为
Edit:由于您希望处理 keyK(假设K=Set{K1,K2…Kn}),在分区中使用StaticRDD,因此我建议采用如下方法。我还没有检查语法和正确性,但你会明白的。
val kRddBroadcastVar = .... // broadcasted variable
val keyValRDD = staticRDD.mapPartitions {
iter => transformKRddToTuple2Events(iter, kRddBroadcastVar )
}
def transformKRddToTuple2Events( iter: Iterator[Object], kRddBroadcastVar: List[KeyObjectType] ) : Iterator[(keyObjectType, valueObjectType )] {
val staticList = iter.toList
val toReturn = kRddBroadcastVar.map ( k => getKeyValue(k, staticList) )
toReturn.iterator
}
val outRdd = keyValRDD.reduceByKey( _ + _ )
如果这是有意义的,标记这个答案接受。
静态RDD是否足够小,可以缓存。在这种情况下,Spark将尝试在这些节点上运行流任务。但这并不能保证。
如果参考数据很小,为什么不广播 DataSet 呢。
我们一直在尝试解决数据存储SnappyData(http://www.snappydata.io/),其中数据位置为一等公民。