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_idevent_typeuser_idamountevent_time
1view134.562024-06-01 00:01:00
2purchase278.902024-06-01 00:02:00
...............

随机采样

使用

ORDER BY RAND()
ORDER BY RAND()
获取随机样本。适合需要无偏样本的场景,但大数据量时性能较差。

-- 随机获取 10 行数据 SELECT * FROM large_events ORDER BY RAND() LIMIT 10;

适用场景

  • 数据集较小(百万行以内)
  • 需要严格的随机性
  • 模型训练数据划分

百分比采样

使用

TABLESAMPLE
TABLESAMPLE
按固定比例采样,性能最优,适合大数据量快速探索。

-- 采样约 10% 的数据 SELECT * FROM large_events TABLESAMPLE(10 PERCENT);

结果说明

  • 实际返回行数约为总行数的 10%(存在微小波动)。
  • 采样基于底层数据块,速度极快,无需全表扫描。

分桶采样

使用取模运算将数据分桶,取其中一桶作为样本。保证采样的均匀性和可重复性。

-- 按 user_id 分 2 桶,取第 0 桶(约 50% 数据) SELECT * FROM large_events WHERE user_id % 2 = 0;

优势

  • 可重复:相同条件每次返回相同样本,便于调试和对比。
  • 均匀:哈希函数保证样本分布均匀。
  • 高效:无需排序,直接过滤。

清理测试数据

完成采样验证后,建议清理测试表:

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


注意事项

  1. LIMIT 顺序不稳定:不带
    ORDER BY
    ORDER BY
    LIMIT
    LIMIT
    返回顺序不保证,如需稳定结果请加排序。
  2. RAND() 性能
    ORDER BY RAND()
    ORDER BY RAND()
    需全表扫描并排序,大数据量时避免使用。
  3. TABLESAMPLE 精度:基于数据块采样,返回行数可能有 5%-10% 的波动。
  4. 采样与分区:如果表已分区,采样会跨所有分区进行;如需单分区采样,先加
    WHERE
    WHERE
    过滤分区。

相关文档

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