删除超过 4 个的重复项。最多只保留 4 个重复项

Remove the number of duplicates which is more than 4. Only a maximum of 4 duplicates will remain

我有一个 DataFrame,在 col text 中有重复项(实际上,该列的内容是其他几个列的连接)。 Col dubs 是 col 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|
+----+----+

我知道如何删除重复项,但这对我来说有点挑战,我真的不知道如何处理。非常感谢任何帮助!

您可以为分区的 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|
+----+----+