删除大于4的重复项。最多只能保留4个重复项

时间:2020-07-20 17:16:37

标签: pyspark duplicates pyspark-dataframes

我有一个DataFrame,在col text中有重复项(实际上,此列的内容是其他几列的连接)。第dubs行是第text行的重复次数。

我的挑战:
删除大于4的重复项。因此最多只能保留4个重复项。如果少于或等于4个重复项,请保留所有重复项。没有其他条件。

df = spark.createDataFrame([
  ["aaa","1"],
  ["bbb","2"],
  ["bbb","2"],
  ["ccc","5"],
  ["ccc","5"],
  ["ccc","5"],
  ["ccc","5"],
  ["ccc","5"],
  ["ddd","4"],
  ["ddd","4"],
  ["ddd","4"],
  ["ddd","4"]
]).toDF("text","dubs")

预期输出:

+----+----+
|text|dubs|
+----+----+
| aaa|   1|
| bbb|   2|
| bbb|   2|
| ccc|   5|
| ccc|   5|
| ccc|   5|
| ccc|   5|
| ddd|   4|
| ddd|   4|
| ddd|   4|
| ddd|   4|
+----+----+

我知道如何删除重复项,但这对我来说是一个挑战,我真的不知道如何处理。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

您可以为分区的text列分配行号,并针对任何text列值删除行号> 4的任何行。

df.withColumn("row_num", row_number().over(Window.partitionBy("text").orderBy("text"))) \
  .filter(col("row_num")< 5).drop("row_num") \
  .orderBy("text").show()



+----+----+
|text|dubs|
+----+----+
| aaa|   1|
| bbb|   2|
| bbb|   2|
| ccc|   5|
| ccc|   5|
| ccc|   5|
| ccc|   5|
| ddd|   4|
| ddd|   4|
| ddd|   4|
| ddd|   4|
+----+----+