一、适用场景
大数据体系下,在真正的企业环境中,很容易出现很大的表,比如体积达到TB
级别。
对这种表一个简单的SELECT *
都会非常的慢,哪怕LIMIT 10
想要看10
条数据,也会走MapReduce
流程,这个时间等待是不合适的。
于是,Hive
提供了快速抽样的解决办法,可以快速从大表中随机抽取一些数据供用户查看。
二、实操
1、基于随机分桶抽样
语法
sql
SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))
y
表示将表数据随机划分成y
份(y
个桶)
x
表示从y
个桶中,抽取第x
个桶的数据
colname
表示随机的依据基于某个列的值,进行分桶
rand()
表示随机的依据基于整行,进行分桶
例如
将orders
表数据,按照username
列,根据hash
取模,分成10
个桶,取第1桶
数据。
查询结果不变
sql
SELECT username, orderId, totalmoney FROM itheima.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON username);
将orders
表数据,随机分成10
个桶,取第1桶
数据。
查询结果每次都不同
sql
SELECT * FROM itheima.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON rand());
2、基于数据块抽样
语法
sql
SELECT ... FROM tbl TABLESAMPLE(num ROWS | num PERCENT | num(K|M|G));
num ROWS
表示抽样num
条数据
num PERCENT
表示抽样num
百分百比例的数据
num(K|M|G)
表示抽取num
大小的数据,单位可以是K、M、G
表示KB、MB、GB
例如
sql
-- 抽取100条
select * from itheima.orders tablesample(100 rows);
-- 取1%数据
select * from itheima.orders tablesample(1 percent);
-- 取 1KB数据
select * from itheima.orders tablesample(1K);
注意
使用这种语法抽样,条件不变的话,每一次抽样的结果都一致
即无法做到随机
,只是按照数据顺序从前向后取。