在Scala Spark中获取前n个不同的键元组

在Scala Spark中获取前n个不同的键元组,scala,apache-spark,tuples,rdd,Scala,Apache Spark,Tuples,Rdd,我有一个带有Tuple的RDD,如下所示 (a, 1), (a, 2), (b,1) 如何使用distinct键获取前两个元组。如果我采取(2),我将得到(a,1)和(a,2) 我需要的是(a,1),(b,1)(键是不同的)。值是不相关的。以下是我在Scala中总结的内容 sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 1))) .reduceByKey((k1,k2) => k1) .collect() 输出 Array[(S

我有一个带有Tuple的RDD,如下所示

(a, 1), (a, 2), (b,1)
如何使用distinct键获取前两个元组。如果我采取(2),我将得到(a,1)和(a,2)


我需要的是(a,1),(b,1)(键是不同的)。值是不相关的。

以下是我在Scala中总结的内容

sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 1)))
    .reduceByKey((k1,k2) => k1)
    .collect()
输出

Array[(String, Int)] = Array((a,1), (b,1))

由于您已经有了一个
RDD
Pair
,您的
RDD
具有由
org.apache.spark.RDD.pairddfunctions提供的额外键值功能。让我们利用这一点

val pairRdd = sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 1)))
// RDD[(String, Int)]

val groupedRdd = pairRdd.groupByKey()
// RDD[(String, Iterable[Int])]

val requiredRdd = groupedRdd.map((key, iter) => (key, iter.head))
// RDD[(String, Int)]
或者简言之

sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 1)))
  .groupByKey()
  .map((key, iter) => (key, iter.head))
这很容易。。。。。 您只需像下面一样使用该功能:

val data = sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 1)))
data.collectAsMap().foreach(println)

这篇文章底部的例子应该会有所帮助@cricket将比较整个元组。我需要比较的只是元组的键。如果它是一个RDD,collectAsMap可能会爆炸,因为数据不适合一个节点。如果它合适,就不需要使用SparkI,也不会得到您真正需要的结果,如果您只想获得distinct键并忽略该值,则可以简化COMMEMTSC中已有一个WSER-
reduceByKey
可以在原始元组RDD上调用,那么您就不需要在开始和结束时使用映射:
input.reduceByKey((k1,k2)=>k1)。取(2)
就足够了