Lakehouse 缺失值填充指南

概述

数据缺失是数据清洗中最常见的问题。云器 Lakehouse 提供多种处理 NULL 值的函数,包括条件替换、默认值填充、前后值填充等。本指南按业务场景分类,帮助你快速掌握高效的缺失值处理方法。

涉及的 SQL 命令

命令/函数用途适用场景
COALESCE(col1, col2, ...)
COALESCE(col1, col2, ...)
返回第一个非 NULL 值多优先级默认值填充
IFNULL(col, value)
IFNULL(col, value)
NULL 时返回指定值简单默认值填充
NULLIF(col, value)
NULLIF(col, value)
等于指定值时返回 NULL将特定值转为 NULL
LAG(col) / LEAD(col)
LAG(col) / LEAD(col)
访问前后行数据时间序列前后值填充
AVG() OVER (PARTITION BY)
AVG() OVER (PARTITION BY)
分组平均值分组统计值填充
IS NULL
IS NULL
/
IS NOT NULL
IS NOT NULL
NULL 值判断条件过滤

前置准备

以下示例使用模拟的用户信息表

user_profiles
user_profiles
,包含部分缺失数据:

-- 创建测试表 CREATE TABLE IF NOT EXISTS user_profiles ( user_id INT, user_name STRING, age INT, city STRING, last_login DATE ); -- 插入测试数据(包含 NULL 值) INSERT INTO user_profiles VALUES (1, 'Alice', 28, 'Shanghai', '2024-06-01'), (2, 'Bob', NULL, 'Beijing', '2024-05-15'), (3, 'Carol', 35, NULL, '2024-06-02'), (4, 'David', NULL, NULL, '2024-04-20'), (5, 'Eve', 22, 'Shanghai', NULL);


基础 NULL 替换

使用

COALESCE
COALESCE
函数按优先级替换 NULL 值,支持多个备选值。

-- 使用 COALESCE 填充缺失的城市信息 SELECT user_id, user_name, COALESCE(city, 'Unknown') as city FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_namecity
1AliceShanghai
2BobBeijing
3CarolUnknown
4DavidUnknown
5EveShanghai

多优先级填充

COALESCE
COALESCE
可以链式使用,按优先级依次尝试:

-- 多优先级填充:优先用城市,其次用 'N/A' SELECT user_id, user_name, COALESCE(city, user_name, 'N/A') as display_location FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_namedisplay_location
1AliceShanghai
2BobBeijing
3CarolCarol
4DavidDavid
5EveShanghai

两值条件替换

当只需要在 NULL 和一个默认值之间切换时,

IFNULL
IFNULL
更简洁。

-- 使用 IFNULL 填充缺失的年龄 SELECT user_id, user_name, IFNULL(age, 0) as age FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_nameage
1Alice28
2Bob0
3Carol35
4David0
5Eve22

将特定值转为 NULL

使用

NULLIF
NULLIF
将无意义的占位值(如 0、空字符串)转为 NULL:

-- 将年龄为 0 的记录转为 NULL(表示未知) SELECT user_id, user_name, NULLIF(age, 0) as age FROM user_profiles ORDER BY user_id;


前后值填充

在时间序列数据中,常用前一行或后一行的值填充当前缺失值。

-- 使用上一次登录时间填充缺失值 SELECT user_id, user_name, last_login, LAG(last_login) OVER (ORDER BY user_id) as prev_login, COALESCE(last_login, LAG(last_login) OVER (ORDER BY user_id)) as filled_login FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_namelast_loginprev_loginfilled_login
1Alice2024-06-01NULL2024-06-01
2Bob2024-05-152024-06-012024-05-15
3Carol2024-06-022024-05-152024-06-02
4David2024-04-202024-06-022024-04-20
5EveNULL2024-04-202024-04-20

分组均值填充

对于数值型缺失值,常用同组的平均值或中位数填充。

-- 使用同龄用户的平均年龄填充缺失值(按城市分组) SELECT user_id, user_name, age, city, ROUND(AVG(age) OVER (PARTITION BY city), 1) as city_avg_age, COALESCE(age, AVG(age) OVER (PARTITION BY city)) as filled_age FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_nameagecitycity_avg_agefilled_age
1Alice28Shanghai2528
2BobNULLBeijingNULLNULL
3Carol35NULL3535
4DavidNULLNULL3535
5Eve22Shanghai2522

NULL 值判断

正确处理 NULL 值的逻辑判断,避免常见问题。

-- 正确的 NULL 判断方式 SELECT user_id, user_name, CASE WHEN age IS NULL THEN 'Unknown' WHEN age < 18 THEN 'Minor' WHEN age < 60 THEN 'Adult' ELSE 'Senior' END as age_group FROM user_profiles ORDER BY user_id;

结果说明

user_iduser_nameage_group
1AliceAdult
2BobUnknown
3CarolAdult
4DavidUnknown
5EveAdult

常见问题

-- ❌ 错误:NULL 与任何值比较都返回 NULL(不是 TRUE) SELECT * FROM user_profiles WHERE age = NULL; -- 返回 0 行 -- ✅ 正确:使用 IS NULL SELECT * FROM user_profiles WHERE age IS NULL;


清理测试数据

完成缺失值处理验证后,建议清理测试表:

-- 删除测试表 DROP TABLE IF EXISTS user_profiles;


注意事项

  1. COALESCE vs IFNULL
    COALESCE
    COALESCE
    是标准 SQL,支持多个参数;
    IFNULL
    IFNULL
    只支持两个参数,是
    COALESCE
    COALESCE
    的简写形式。
  2. NULL 与空字符串
    NULL
    NULL
    表示缺失值,
    ''
    ''
    (空字符串)是有效值。处理时需区分。
  3. 聚合函数与 NULL
    COUNT(col)
    COUNT(col)
    不统计 NULL 值,
    SUM()
    SUM()
    AVG()
    AVG()
    会忽略 NULL 值。
  4. NULL 值显示:Lakehouse 中数值类型 NULL 显示为
    nan
    nan
    ,时间类型 NULL 显示为
    NaT
    NaT
    ,但逻辑判断不受影响。

相关文档

联系我们
预约咨询
微信咨询
电话咨询