Hive Sampling 抽样函数
在HQL中,可以通过三种方式采样数据:随机采样,存储桶表采样和块采样。
Random随机抽样
- 随机抽样使用rand()函数确保随机获取数据,LIMIT来限制抽取的数据个数。
- 表数据多时抽样速度不快,但随机。
- 有两种用法:
方法一:(效率较高)
SELECT * FROM student
DISTRIBUTE BY RAND() SORT BY RAND() LIMIT 2;
方法二:
SELECT * FROM student
ORDER BY RAND() LIMIT 2;
Block 基于数据块抽样
- 允许随机获取n行数据、百分比数据、指定大小的数据
- 采样粒度是HDFS块大小
- 优点是速度快,但不随机
- 例:
- 获取1行数据:
SELECT * FROM student
TABLESAMPLE(1 ROWS);
- 百分比数据:
SELECT * FROM student
TABLESAMPLE(50 PERCENT);
- 指定大小的数据:
SELECT * FROM student
TABLESAMPLE(1k);
Bucket table 基于分桶表抽样
- 一种特殊的采样方法,针对分桶表进行了优化
- 抽样既随机,速度也很快。
语法
- y必须是table总桶数的倍数或因子。hive根据y的大小,决定抽样的比例。(当y=2,有4个桶时,抽取4/2个桶的数据)
- x表示从哪个桶开始抽取。
- x的值必须小于y的值。
- ON colname表示基于什么抽
- ON RAND():表示随机抽
- ON 分桶字段:表示基于分桶字段抽样,效率更高
TABLESAMPLE (BUCKET x OUT OF y [ON colname])
- 例:
SELECT * FROM t_usa_covid19_bucket TABLESAMPLE(BUCKET 1 OUT OF 5 ON RAND());