如何在PySpark中筛选DataFrame单列的去重非空值
PySpark 从指定列筛选非空去重值的实现方案
假设你当前处理的 DataFrame 名为 df,需要处理的目标列名为 target_col,可按以下方式操作:
基础实现(仅过滤null值)
先做非空过滤、再选中目标列、最后执行去重,效率更高:
# 得到仅包含目标列非空唯一值的DataFrame result_df = df.filter(df.target_col.isNotNull()) \ .select("target_col") \ .distinct()
如果你需要把结果转为Python列表用于后续逻辑,可追加转换操作:
unique_value_list = df.filter(df.target_col.isNotNull()) \ .select("target_col") \ .distinct() \ .rdd.flatMap(lambda x: x) \ .collect()
扩展场景(同时过滤null和空字符串)
如果业务逻辑中空字符串也属于需要排除的无效值,可调整过滤条件:
result_df = df.filter( (df.target_col.isNotNull()) & (df.target_col != "") ) \ .select("target_col") \ .distinct()
替代写法
你也可以用dropDuplicates()方法替代distinct(),二者在单字段去重场景下效果一致:
result_df = df.filter(df.target_col.isNotNull()).select("target_col").dropDuplicates()
注意事项
- 优先执行过滤再执行去重,可以减少去重阶段需要处理的数据量,提升运行效率
- 如果列名包含空格、特殊字符,可使用
df["目标列名"]的格式替代df.目标列名写法,避免语法报错
内容的提问来源于stack exchange,提问作者t1808
相关产品推荐
相关产品推荐

