如果某些值为 null,则在 SUM 中返回 null

Sau*_*Das 4 null aggregate apache-spark apache-spark-sql pyspark

我遇到的情况是,列中可能有空值,需要在组中求和。

如果我在组中遇到空值,我希望该组的总和为空。但 PySpark 默认情况下似乎会忽略空行并对其余非空值求和。

例如:

在此输入图像描述

dataframe = dataframe.groupBy('dataframe.product', 'dataframe.price') \
                     .agg(f.sum('price'))
Run Code Online (Sandbox Code Playgroud)

预期输出是:

在此输入图像描述

但我得到:

在此输入图像描述

bla*_*hop 7

sum仅当该列的所有值均为空时,函数才返回 NULL,否则将忽略空值。

您可以使用条件聚合,如果count(price) == count(*)这意味着不存在空值并且我们返回sum(price)。否则,返回 null:

from pyspark.sql import functions as F

df.groupby("product").agg(
    F.when(F.count("price") == F.count("*"), F.sum("price")).alias("sum_price")
).show()

#+-------+---------+
#|product|sum_price|
#+-------+---------+
#|      B|      200|
#|      C|     null|
#|      A|      250|
#+-------+---------+
Run Code Online (Sandbox Code Playgroud)

Spark 3.0+开始,还可以使用any函数:

df.groupby("product").agg(
    F.when(~F.expr("any(price is null)"), F.sum("price")).alias("sum_price")
).show()
Run Code Online (Sandbox Code Playgroud)