1. Hive直接抽样
-- 原来的50%
select * from liyang tablesample(50 percent)
-- 30M
select * from liyang tablesample(30M)
-- 200行 每个map200行
select * from liyang tablesample(200 rows)
2. Hive分桶抽样
Hive中的分桶表(Bucket Table),其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表liyang按照ID分成100个桶,其算法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。分桶表在创建时候使用cluster by语句创建。
2.1 对未分桶表进行分桶抽样
-- 随机分成10个桶,取第一个桶数据
select * from liyang tablesample(bucket 1 out of 10 on rand())
2.2 对已分桶表进行分桶抽样
-- 创建分桶表
create table liyang(id string)
clustered by(id) into 10 buckets;
-- 直接取第一个桶
select * from liyang tablesample(bucket 1 out of 10 on id)
-- 对第一个桶抽样一半
select * from liyang tablesample(bucket 1 out of 20 on id)
3. Hive随机抽取
方式一:
distribute by rand()
sort by rand()
limit 10000
方式二:针对方式一进一步减小压力,先过滤在进行抽样 (推荐)
select
flag_md5
,event_time
,active_time
,flag
from tablename
where ds = 202106
and rand() < 0.001
distribute by rand()
sort by rand()
limit 10
方式三:
order by rand()
limit 100
方式四:
select
t.x
,t.a
from(
select x
,rand() a
from tablename
)t
where t.a between 0 and 0.2
4. Mysql随机抽样
select
*
from users
order by rand()
limit 1
-- (最大的ID - 最小的ID) * 随机值 + 最小的ID
select
*
from users
where userid >=
(
(select max(userid) from users) -
(select min(userid) from users)
) * rand() + (select min(userid) from users)
limit 1
mysql随机抽样推荐使用第二种,因为order by性能不好