Spark分组函数与NULL值处理

本章节深入探讨Spark SQL中分组函数的行为以及如何处理NULL值。

5.1 COUNT函数

在Spark SQL中,COUNT(*)函数统计表中的总行数,包括NULL值。即使表为空,COUNT(*)也会返回0,而不是NULL。

5.2 聚合函数:AVG,MAX,MIN,SUM

Spark SQL 提供了多种聚合函数,例如 AVGMAXMINSUM。需要注意的是,这些函数默认情况下会忽略NULL值。

5.3 分组函数与NULL值

分组函数在计算时默认会忽略NULL值。例如,AVG(comm) 会计算 comm 列的平均值,但会忽略 comm 列中的所有NULL值。

使用NVL函数处理NULL值

可以使用 NVL() 函数将NULL值替换为指定值,以便在分组函数中进行处理。例如,AVG(NVL(comm, 0)) 会将 comm 列中的所有NULL值替换为0,然后计算平均值。

5.4 GROUP BY子句

GROUP BY 子句用于对查询结果进行分组。

  • 出现在 SELECT 列表、ORDER BY 子句或聚合函数中的字段必须包含在 GROUP BY 子句中。
  • GROUP BY 子句中的字段不需要出现在 SELECT 列表中。
  • 可以使用 WHERE 子句过滤数据,但不能使用聚合函数。
  • 可以使用 ORDER BY 子句对分组结果进行排序。
  • 如果没有 GROUP BY 子句,则 SELECT 列表中不能同时出现单行函数和聚合函数。

示例:

-- 合法
SELECT empno, sal FROM emp; 
SELECT AVG(sal) FROM emp; 

-- 非法:SELECT列表中不能同时出现单行函数和聚合函数
SELECT empno, INITCAP(ename), AVG(sal) FROM emp; 

-- 非法:WHERE子句中不能使用聚合函数
SELECT deptno, AVG(sal) FROM emp WHERE AVG(sal) > 2000 GROUP BY deptno; 

5.5 HAVING子句

HAVING 子句用于对分组结果进行过滤,可以使用聚合函数。

示例:

SELECT deptno, job, AVG(sal) FROM emp GROUP BY deptno, job HAVING AVG(sal) > 2000;