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
相关产品推荐
相关产品推荐

