如何获得RDD的子集?

时间:2015-09-25 00:23:49

标签: scala apache-spark rdd

我是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?非常感谢你。

1 个答案:

答案 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)}