解决Spark 1.4.1中SUM为null的列返回0的问题

常规的SQL中,执行SUM函数时,如果一列全为null,那么SUM应该返回null,不过在Spark 1.4.0 ~ 1.4.1版本中(目前的最新版本),SUM为null的列返回0,Spark 1.3.x中没有这个问题,我在Spark社区提过这个问题,给的解释是为了规避Hive的一个问题,估计要在Spark 1.5的版本中才能解决。

http://apache-spark-developers-list.1001551.n3.nabble.com/SparkSQL-1-4-0-The-result-of-SUM-xxx-in-SparkSQL-is-0-0-but-not-null-when-all-data-in-column-xxx-arel-td13008.html

解决方案

修改sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregates.scala, 定位到621行,将以下代码:

  private val addFunction =
    Coalesce(Seq(Add(Coalesce(Seq(sum, zero)), Cast(expr, calcType)), sum, zero))

修改为:

  private val addFunction =
    Coalesce(Seq(Add(Coalesce(Seq(sum, zero)), Cast(expr, calcType)), sum))

重新编译代码就好了。