如何在PySpark中删除姓氏与性别重复的数据行?
用PySpark删除姓氏与性别均重复的所有行
直接上实操步骤,针对你给出的数据集,要删掉所有姓氏(last_name)和性别(gender)组合重复的行(也就是Smith+M的那两行),具体做法如下:
1. 初始化Spark环境并加载数据
先创建SparkSession,把你的数据转换成带列名的DataFrame:
from pyspark.sql import SparkSession from pyspark.sql.functions import count, col # 启动SparkSession spark = SparkSession.builder.appName("RemoveDupGroups").getOrCreate() # 你的原始数据 data = [('James','Smith','M',30),('Anna','Rose','F',41), ('Robert','Smith','M',62),('Jake','Rose','M',21) ] # 创建DataFrame,指定列名 df = spark.createDataFrame(data, schema=["first_name", "last_name", "gender", "age"]) df.show()
运行后能看到原始数据:
+----------+---------+------+---+ |first_name|last_name|gender|age| +----------+---------+------+---+ | James| Smith| M| 30| | Anna| Rose| F| 41| | Robert| Smith| M| 62| | Jake| Rose| M| 21| +----------+---------+------+---+
2. 用窗口函数高效过滤重复分组
最推荐的高效方式是用窗口函数,直接给每行标记它所在的(last_name, gender)组合的出现次数,再过滤掉次数大于1的行:
from pyspark.sql.window import Window # 定义窗口:按姓氏和性别分组 window_spec = Window.partitionBy("last_name", "gender") # 给每行添加分组内的计数列,过滤后移除计数列 result_df = df.withColumn("group_count", count("*").over(window_spec)) \ .filter(col("group_count") == 1) \ .drop("group_count") # 查看最终结果 result_df.show()
最终输出结果
运行后就能得到过滤后的DataFrame,Smith+M的重复组合行已经被全部删除:
+----------+---------+------+---+ |first_name|last_name|gender|age| +----------+---------+------+---+ | Anna| Rose| F| 41| | Jake| Rose| M| 21| +----------+---------+------+---+
替代写法(分组关联过滤)
如果不习惯窗口函数,也可以先分组统计每个组合的出现次数,再关联回原表过滤:
# 分组统计每个(姓氏+性别)组合的出现次数 group_counts = df.groupBy("last_name", "gender").agg(count("*").alias("count")) # 关联回原表,过滤掉出现次数大于1的行 result_df = df.join(group_counts, on=["last_name", "gender"], how="left") \ .filter(col("count") == 1) \ .drop("count") result_df.show()
这个写法和窗口函数的结果完全一致,只是多了一步关联操作,效率略低于窗口函数。
内容的提问来源于stack exchange,提问作者Arun Vijay
相关产品推荐
相关产品推荐

