如何获取 RDD 的子集?

How to get a subset of a RDD?

我是 Spark 的新手。如果我有一个由键值对组成的 RDD,那么 return 这个 RDD 的一个子集包含在原始 RDD 中出现超过一定次数的键的有效方法是什么?

比如我的原始数据RDD是这样的:

val dataRDD=sc.parallelize(List((1,34),(5,3),(1,64),(3,67),(5,0)),3)

我想得到一个新的RDD,其中key在dataRDD中出现不止一次。 newRDD 应该包含这些元组:(1,34),(5,3),(1,64),(5,0)。我怎样才能得到这个新的 RDD?非常感谢。

计数键并过滤不频繁:

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