我是Spark的新手。如果我的RDD由键值对组成,那么返回包含在原始RDD中出现超过特定时间的键的RDD子集的有效方法是什么?
例如,如果我的原始数据RDD是这样的:
val dataRDD=sc.parallelize(List((1,34),(5,3),(1,64),(3,67),(5,0)),3)
我想获得一个新的RDD,其中的键在dataRDD中出现不止一次。新的RDD应该包含这些元组:(1,34),(5,3),(1,64),(5,0)。我怎样才能获得这个新的RDD?非常感谢你。
答案 0 :(得分:4)
计数键并过滤不频繁:
val counts = dataRDD.keys.map((_, 1)).reduceByKey(_ + _)
val infrequent = counts.filter(_._2 == 1)
如果要在内存中处理的偶数值很大,您可以使用PairRDDFunctions.subtractByKey
:
dataRDD.subtractByKey(infrequent)
否则是广播变量:
val infrequentKeysBd = sc.broadcast(infrequent.keys.collect.toSet)
dataRDD.filter{ case(k, _) => !infrequentKeysBd.value.contains(k)}
如果频繁键的数量非常低,您可以过滤频繁键并使用上述广播变量:
val frequent = counts.filter(_._2 > 1)
val frequentKeysBd = ??? // As before
dataRDD.filter{case(k, _) => frequentKeysBd.value.contains(k)}