如何列出PySpark DataFrame中所有值均为Null或'0'的列
错误原因
你之前仅用isNull()方法实现逻辑存在两个核心问题:
- 判定条件不全:仅校验了值是否为Null,没有覆盖值为0的匹配场景
- 缺少整列聚合校验逻辑:没有判断「列内所有值都满足要求」,只要列内存在任意非Null、非0的值,该列就不符合筛选规则,因此会把存在'M'、'F'值的Col3,存在'TW18'值的Col5错误纳入结果。
正确实现方案
核心判定逻辑:对每一列统计既不是Null、也不等于0的记录数,如果该计数为0,说明整列值全为Null或0,符合筛选要求。
基础易懂写法
逻辑直白好理解,适合小数据量场景:
from pyspark.sql import functions as F # 替换为你的DataFrame变量名 df = # 你的源DataFrame result_cols = [] for col_name in df.columns: # 筛选当前列中 非Null且非0 的异常行 abnormal_row_count = df.filter( ~(F.col(col_name).isNull() | (F.col(col_name) == 0)) ).count() # 无异常行则说明该列符合要求 if abnormal_row_count == 0: result_cols.append(col_name) # 最终输出 ['Col2', 'Col4'] print(result_cols)
高性能写法
仅触发一次Spark计算任务,适合大数据量场景,避免逐列count带来的性能损耗:
from pyspark.sql import functions as F # 一次聚合计算所有列的异常值数量 agg_expressions = [ F.sum( (~(F.col(col).isNull() | (F.col(col) == 0))).cast("int") ).alias(col) for col in df.columns ] agg_res = df.agg(*agg_expressions).collect()[0] # 筛选异常值总数为0的列 result_cols = [col for col in df.columns if agg_res[col] == 0]
逻辑说明
F.col(col_name).isNull() | (F.col(col_name) == 0)用于匹配列中值为Null或者0的合法行- 前面加
~取反,即可筛选出所有不符合规则的异常行 - 异常行计数为0时,证明整列没有非0、非Null的异常值,就是需要找的目标列
内容的提问来源于stack exchange,提问作者Advik Singh
相关产品推荐
相关产品推荐

