You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:05:20