在 Hive 中,空值(NULL)的处理和传统的 RDBMS(如 MySQL、Oracle)有一些相似之处,但也有 Hive 自身的特点。下面从存储、判断、转换、运算、统计几个方面系统说明。
Hive 使用 SQL 标准中的 NULL 表示“未知 / 缺失值”。
SELECT NULL;
'''' 不是 NULLSTRING 且你显式插入 '''' IS NULL -- false
'' = NULL -- NULL(不是 true)
⚠️ 很多“看起来为空”的问题,其实是空字符串而不是 NULL。
col IS NULL
col IS NOT NULL
col = NULL -- 永远返回 NULL
col != NULL -- 永远返回 NULL
COALESCE(推荐)返回第一个非 NULL 的值:
COALESCE(col, 0)
COALESCE(col1, col2, 'unknown')
NVL(兼容 Oracle)NVL(col, 0)
IFIF(col IS NULL, 0, col)
CASE WHENCASE WHEN col IS NULL THEN 0 ELSE col END
NULLIF(col, '')
COALESCE(col, '')
只要有一个操作数是 NULL,结果就是 NULL:
1 + NULL --> NULL
NULL || 'abc' --> NULL
(Hive 中可用 CONCAT)
CONCAT(COALESCE(col, ''), 'abc')
| 函数 | 对 NULL 的处理 |
|---|---|
| COUNT(col) | 忽略 NULL |
| COUNT(*) | 不忽略 |
| SUM / AVG | 忽略 NULL |
| MAX / MIN | 忽略 NULL |
COUNT(col) -- 不包含 NULL
COUNT(*) -- 包含 NULL 行
a.id = b.id
如果 id 为 NULL,不会 JOIN 上
COALESCE(a.id, -1) = COALESCE(b.id, -1)
⚠️ 仅在你确认业务允许时这样做。
默认:
\N 表示 NULL'')不是 NULLROW FORMAT DELIMITED
NULL DEFINED AS '\N'
TBLPROPERTIES ('serialization.null.format' = '')
SELECT
user_id,
COALESCE(amount, 0) AS amount
FROM orders;
SELECT COUNT(user_name)
FROM user;
SELECT
CASE
WHEN col IS NULL OR col = '' THEN 'unknown'
ELSE col
END
FROM t;
如果你有具体业务场景(比如加载日志、JOIN 失败、SUM 变 NULL、ETL 清洗),可以贴出来,我可以给你更针对性的 Hive SQL 写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。