首页 > 解决方案 > Spark 在数据集中保持最多 10 个重复项

问题描述

我一直在用 Spark 试验一个大型数据集。我的数据的基本问题之一是它有重复,我想删除它们。但是我的删除案例有点不同,因为我想在我的数据中保留最多 10 个重复项并删除其他所有内容。

我对该.dropDuplicates()函数进行了试验,结果发现它消除了数据集中的所有重复项。任何帮助或指针在这里表示赞赏。

标签: apache-sparkapache-spark-sqlduplicates

解决方案


检查下面的代码。

scala> val df = Seq(("Srinivas",1),("Ravi",2),("Srinivas",1),("Srinivas",1),("Kumar",3),("Srinivas",1),("Srinivas",1),("Srinivas",1),("Srinivas",1)).toDF("name","age")
df: org.apache.spark.sql.DataFrame = [name: string, age: int]

scala> df.orderBy($"name").show(false) // 7 duplicate names.
+--------+---+
|name    |age|
+--------+---+
|Kumar   |3  |
|Ravi    |2  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
+--------+---+


scala> val keepOnly = 4
keepOnly: Int = 4

scala> val duplicates = df.withColumn("rowid",row_number().over(Window.partitionBy($"name",$"age").orderBy($"name",$"age"))).withColumn("rowid",when($"rowid" > keepOnly,lit(1)).otherwise($"rowid"))
duplicates: org.apache.spark.sql.DataFrame = [name: string, age: int ... 1 more field]

scala> duplicates.show(false)
+--------+---+-----+
|name    |age|rowid|
+--------+---+-----+
|Srinivas|1  |1    |
|Srinivas|1  |2    |
|Srinivas|1  |3    |
|Srinivas|1  |4    |
|Srinivas|1  |1    |
|Srinivas|1  |1    |
|Srinivas|1  |1    |
|Kumar   |3  |1    |
|Ravi    |2  |1    |
+--------+---+-----+


scala> duplicates.drop
drop   dropDuplicates

scala> duplicates.dropDuplicates.drop("rowid").show(false)
+--------+---+
|name    |age|
+--------+---+
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Srinivas|1  |
|Kumar   |3  |
|Ravi    |2  |
+--------+---+


推荐阅读