删除超过 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|
+----+----+
我有一个 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|
+----+----+