如何获取 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)}
我是 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)}