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

Spark中使用MAX聚合时如何不忽略NULL值,存在NULL则返回NULL?

在Spark中实现包含NULL时返回NULL的MAX聚合

默认Spark的max聚合函数会忽略NULL值,但如果需要当列中存在NULL时聚合结果直接返回NULL,可以通过先判断NULL存在性,再决定返回值的方式实现,以下是两种可行方案:

方案1:统计NULL数量判断

通过统计列中NULL的数量,若数量大于0则返回NULL,否则返回正常MAX值:

from pyspark.sql import functions as F

# 初始化测试DataFrame
df = spark.createDataFrame([(None,), (1,), (2,)], ['col_name'])

# 执行聚合
result = df.agg(
    F.when(
        # 统计列中NULL的个数
        F.count(F.when(F.col('col_name').isNull(), 1)) > 0,
        None
    ).otherwise(F.max('col_name')).alias('col_name')
)

result.show()
# 输出结果:
# +--------+
# |col_name|
# +--------+
# |    null|
# +--------+

方案2:用标记值判断NULL存在性

通过给NULL标记为1、非NULL标记为0,取标记值的MAX,若MAX为1则说明存在NULL,返回NULL,否则返回正常MAX值:

result = df.agg(
    F.when(
        # 检查是否存在NULL标记
        F.max(F.when(F.col('col_name').isNull(), 1).otherwise(0)) == 1,
        None
    ).otherwise(F.max('col_name')).alias('col_name')
)

result.show()
# 输出结果与方案1一致

无NULL时的验证

当列中没有NULL时,两种方案都会返回正常的MAX结果:

df_no_null = spark.createDataFrame([(1,), (2,)], ['col_name'])
result_no_null = df_no_null.agg(
    F.when(
        F.count(F.when(F.col('col_name').isNull(), 1)) > 0,
        None
    ).otherwise(F.max('col_name')).alias('col_name')
)

result_no_null.show()
# 输出结果:
# +--------+
# |col_name|
# +--------+
# |       2|
# +--------+

内容的提问来源于stack exchange,提问作者ZygD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26