在 Hive 中,缺失值(NULL)的处理是数据清洗与聚合分析中的常见任务,尤其是在使用聚合函数进行统计时——MAX、MIN、SUM、AVG 等函数默认会自动跳过 NULL 值,仅对非空数据参与计算。但在某些业务场景下,你可能需要先将缺失值替换为指定数值,再执行聚合运算。以下介绍的几种方法,是目前业界处理 Hive NULL 值最常用的实用技巧。

方法一:直接利用聚合函数忽略 NULL
如果你只需要获取非空值中的最大值、最小值,最直接的方式就是直接使用聚合函数,它们天生会忽略 NULL 值。例如:
SELECT MAX(column_name) as max_value FROM table_name;
这段代码只会对 column_name 中非 NULL 的记录求最大值,NULL 值会被自动过滤掉。适用于明确不需要处理 NULL 的场景。
方法二:使用 COALESCE() 将 NULL 替换为默认值
COALESCE() 是一个非常实用的函数,它接受一列参数,并返回第一个非 NULL 的值。你可以借助它把 NULL 替换为 0 或任意默认数值,然后再进行聚合。例如:
SELECT MAX(COALESCE(column_name, 0)) as max_value FROM table_name;
这样即使原列中存在 NULL,也会被当作 0 参与计算,最终 max 值会包含 0。需要留意的是:如果原列中所有值都是 NULL,那么返回结果就是 0。
方法三:通过 IF() 条件判断替换 NULL
IF() 函数可以依据条件返回不同的值,逻辑更加灵活。将 NULL 判断条件写入其中,即可实现相同的替换效果:
SELECT MAX(IF(column_name IS NULL, 0, column_name)) as max_value FROM table_name;
思路与 COALESCE 类似,但 IF 可以处理更复杂的条件逻辑,例如针对不同数值做差异化处理。
方法四:采用 NVL() 函数(Hive 中的简洁写法)
NVL() 是许多 SQL 方言中都支持的函数,Hive 也提供了该功能。它只接受两个参数:如果第一个参数是 NULL,则返回第二个参数,否则返回第一个参数。用法如下:
SELECT MAX(NVL(column_name, 0)) as max_value FROM table_name;
这比 COALESCE 更简洁,因为参数数量固定为两个,语义一目了然。
需要提醒的是,以上方法都是针对单个列中的缺失值处理。如果你需要对多个列进行联合处理(例如某几列同时为 NULL 时才替换),则需要在查询中增加更多条件逻辑,比如使用 CASE WHEN 或者嵌套 COALESCE。不过核心思路是一致的:先定位 NULL,再替换,最后聚合。没有复杂的技巧,却足以应对绝大多数实际场景。
