Lakehouse 数据采样探索指南
概述
在处理大规模数据集时,全表扫描往往耗时较长。数据采样允许你快速获取数据的代表性子集,用于探索性分析、模型训练或查询调试。云器 Lakehouse 提供多种采样方式,包括随机采样、固定行数采样和分桶采样。本指南按业务场景分类,帮助你快速掌握高效的数据采样方法。
涉及的 SQL 命令
| 命令/函数 | 用途 | 适用场景 |
|---|
LIMIT n
LIMIT n | 限制返回行数 | 快速查看表结构、前几行数据 |
ORDER BY RAND()
ORDER BY RAND() | 随机排序 | 获取随机样本,适合小数据集 |
TABLESAMPLE
TABLESAMPLE | 表级采样 | 大数据量快速采样,性能最优 |
col % N = k
col % N = k | 取模分桶 | 均匀采样,保证可重复性 |
前置准备
以下示例使用模拟的大数据表
large_events
large_events
(约 1000 行):
-- 创建测试表
CREATE TABLE IF NOT EXISTS large_events (
event_id INT,
event_type STRING,
user_id INT,
amount DOUBLE,
event_time TIMESTAMP
);
-- 插入 1000 行测试数据
INSERT INTO large_events
SELECT
seq,
CASE seq % 3 WHEN 0 THEN 'click' WHEN 1 THEN 'view' ELSE 'purchase' END,
seq % 100,
ROUND(RAND() * 100, 2),
TIMESTAMP '2024-06-01 00:00:00' + INTERVAL (seq % 1440) MINUTE
FROM (SELECT EXPLODE(SEQUENCE(1, 1000)) AS seq) t;
固定行数采样
使用
LIMIT
LIMIT
快速获取前 N 行数据,适合查看表结构和数据分布概览。
-- 查看前 5 行数据
SELECT * FROM large_events LIMIT 5;
结果说明:
| event_id | event_type | user_id | amount | event_time |
|---|
| 1 | view | 1 | 34.56 | 2024-06-01 00:01:00 |
| 2 | purchase | 2 | 78.90 | 2024-06-01 00:02:00 |
| ... | ... | ... | ... | ... |
⚠️ 注意:
LIMIT
LIMIT
不带
ORDER BY
ORDER BY
时,返回顺序不保证稳定,可能随查询执行计划变化。
随机采样
使用
ORDER BY RAND()
ORDER BY RAND()
获取随机样本。适合需要无偏样本的场景,但大数据量时性能较差。
-- 随机获取 10 行数据
SELECT * FROM large_events
ORDER BY RAND()
LIMIT 10;
适用场景:
- 数据集较小(百万行以内)
- 需要严格的随机性
- 模型训练数据划分
💡 提示:对于千万级以上数据,
ORDER BY RAND()
ORDER BY RAND()
会触发全局排序,建议使用
TABLESAMPLE
TABLESAMPLE
或哈希分桶。
百分比采样
使用
TABLESAMPLE
TABLESAMPLE
按固定比例采样,性能最优,适合大数据量快速探索。
-- 采样约 10% 的数据
SELECT * FROM large_events TABLESAMPLE(10 PERCENT);
结果说明:
- 实际返回行数约为总行数的 10%(存在微小波动)。
- 采样基于底层数据块,速度极快,无需全表扫描。
⚠️ 注意:
TABLESAMPLE
TABLESAMPLE
的参数可以是百分比(
TABLESAMPLE(10 PERCENT)
TABLESAMPLE(10 PERCENT)
)或行数(
TABLESAMPLE(10 ROWS)
TABLESAMPLE(10 ROWS)
)。不同版本的语法可能略有差异,如不支持
PERCENT
PERCENT
关键字,可使用哈希分桶替代:
WHERE RAND() < 0.1
WHERE RAND() < 0.1
。
分桶采样
使用取模运算将数据分桶,取其中一桶作为样本。保证采样的均匀性和可重复性。
-- 按 user_id 分 2 桶,取第 0 桶(约 50% 数据)
SELECT * FROM large_events
WHERE user_id % 2 = 0;
优势:
- 可重复:相同条件每次返回相同样本,便于调试和对比。
- 均匀:哈希函数保证样本分布均匀。
- 高效:无需排序,直接过滤。
清理测试数据
完成采样验证后,建议清理测试表:
-- 删除测试表
DROP TABLE IF EXISTS large_events;
💡 提示:Lakehouse 支持
UNDROP TABLE
UNDROP TABLE
,误删后可在保留期内恢复。
注意事项
- LIMIT 顺序不稳定:不带
ORDER BY
ORDER BY
的 LIMIT
LIMIT
返回顺序不保证,如需稳定结果请加排序。
- RAND() 性能:
ORDER BY RAND()
ORDER BY RAND()
需全表扫描并排序,大数据量时避免使用。
- TABLESAMPLE 精度:基于数据块采样,返回行数可能有 5%-10% 的波动。
- 采样与分区:如果表已分区,采样会跨所有分区进行;如需单分区采样,先加
WHERE
WHERE
过滤分区。
相关文档