Hive进行数据抽样& 随机抽取

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性能不好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值