PySpark如何忽略列顺序删除重复行?
解决方案
方法一:利用least和greatest生成有序标识后去重
这是最简洁高效的实现方式,借助PySpark内置函数生成固定顺序的键,以此识别无序重复行:
from pyspark.sql import functions as F # 假设原DataFrame名为df processed_df = df.withColumn("min_val", F.least(F.col("right"), F.col("left"))) \ .withColumn("max_val", F.greatest(F.col("right"), F.col("left"))) \ .dropDuplicates(["min_val", "max_val"]) \ .drop("min_val", "max_val") processed_df.show()
方法二:窗口函数分组保留首行(适合需保留原始行顺序的场景)
如果需要保留每组无序重复行中的某一行(比如首次出现的行),可以用窗口函数实现:
from pyspark.sql import Window window_spec = Window.partitionBy(F.least("right", "left"), F.greatest("right", "left")) \ .orderBy(F.monotonically_increasing_id()) processed_df = df.withColumn("row_num", F.row_number().over(window_spec)) \ .filter(F.col("row_num") == 1) \ .drop("row_num") processed_df.show()
原理说明
least(col1, col2):返回两列中的较小值greatest(col1, col2):返回两列中的较大值
通过这两个函数,不管原始行的两列顺序是(1,2)还是(2,1),生成的min_val和max_val都会统一为(1,2),从而将无序重复行归为同一组,再通过去重或窗口函数筛选完成需求。
内容的提问来源于stack exchange,提问作者Ofek Glick
相关产品推荐
相关产品推荐

