从Spark Scala中删除重复的键

时间:2015-07-27 14:29:20

标签: scala apache-spark

我使用带有scala的spark 1.2并且有一对RDD with(String,String)。示例记录如下所示:

<Key,  value>
id_1,  val_1_1; val_1_2
id_2,  val_2_1; val_2_2
id_3,  val_3_1; val_3_2
id_1,  val_4_1; val_4_2

我只想删除所有带有重复键的记录,因此在上面的示例中,第四条记录将被删除,因为id_1是一个重复键。

请帮助。

感谢。

2 个答案:

答案 0 :(得分:11)

您可以使用reduceByKey

val rdd: RDD[(K, V)] = // ...
val res: RDD[(K, V)] = rdd.reduceByKey((v1, v2) => v1)

答案 1 :(得分:1)

如果有必要始终选择给定键的第一个条目,那么将@JeanLogeart答案与来自@Paul的评论相结合,

import org.apache.spark.{SparkContext, SparkConf}

val data = List(
  ("id_1", "val_1_1; val_1_2"),
  ("id_2",  "val_2_1; val_2_2"),
  ("id_3",  "val_3_1; val_3_2"),
  ("id_1",  "val_4_1; val_4_2") )

val conf = new SparkConf().setMaster("local").setAppName("App")
val sc = new SparkContext(conf)
val dataRDD = sc.parallelize(data)
val resultRDD = dataRDD.zipWithIndex.map{
  case ((key, value), index) => (key, (value, index))
}.reduceByKey((v1,v2) => if(v1._2 < v2._2) v1 else v2).mapValues(_._1)
resultRDD.collect().foreach(v => println(v))
sc.stop()