如何在Spark DataFrame中筛选两列不匹配的行(类Pandas操作)
在Spark DataFrame中筛选两列不相等(含空值处理)的行
问题分析
你用df.filter(col("first") != col("last"))的写法无法得到预期结果,核心原因是Spark中null参与任何比较运算都会返回null,而filter会把null判定为False,导致那些包含null的有效行(比如null, Doe、John, null)也被错误过滤。你的需求是仅排除两列均为null的记录,保留其他所有行。
解决方案
可以用两种简洁方式实现需求:
方式1:直接排除两列全为null的情况
这种写法最贴合需求逻辑,代码也最简洁:
from pyspark.sql import SparkSession from pyspark.sql.functions import col # 初始化环境并创建示例DataFrame data = [("John", "Doe"), (None, "Doe"), ("John", None), (None, None)] spark = SparkSession.builder.appName("col-compare-example").getOrCreate() df = spark.createDataFrame(data, ["first", "last"]) # 过滤逻辑:排除两列同时为null的行 df_filtered = df.filter(~(col("first").isNull() & col("last").isNull())) # 查看结果 df_filtered.show()
方式2:明确匹配所有"不相等"场景
如果想更直观地定义"不相等"(包含单列为null的情况),可以写全判定条件:
df_filtered = df.filter( (col("first") != col("last")) | (col("first").isNull() & col("last").isNotNull()) | (col("first").isNotNull() & col("last").isNull()) )
执行结果
两种方式都会输出你期望的结果:
+-----+----+ |first|last| +-----+----+ | John| Doe| | null| Doe| | John|null| +-----+----+
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

