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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:10:06