我有一个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|
+----+----+
我知道如何删除重复项,但这对我来说是一个挑战,我真的不知道如何处理。任何帮助将不胜感激!
答案 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|
+----+----+