apache-spark - Spark 在数据集中保持最多 10 个重复项
问题描述
我一直在用 Spark 试验一个大型数据集。我的数据的基本问题之一是它有重复,我想删除它们。但是我的删除案例有点不同,因为我想在我的数据中保留最多 10 个重复项并删除其他所有内容。
我对该.dropDuplicates()
函数进行了试验,结果发现它消除了数据集中的所有重复项。任何帮助或指针在这里表示赞赏。
解决方案
检查下面的代码。
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 |
+--------+---+
推荐阅读
- python - 使用 plotly.py 构建带有组的图表时,X 轴上的值顺序错误
- python - Bazel:似乎 `target_compatible_with` 不适用于 py_binary
- svg - 将路径的比例保持在 svg 中
- php - Woocommerce / Wordrpess do_shortcode()产品分页无法正常工作
- python - 在 macOS M1 上使用 pyenv 安装 python 的问题
- c# - 以串行方式执行捆绑的并行任务
- oracle-apex - 页面加载时设置的交互式过滤器仅在手动刷新后显示
- timestamp - 如果解析自定义时间戳失败,则无法使用插入时间戳
- java - 无法在 thymeleaf 中创建发布请求
- sql - 源的语法问题