Hive随机抽样

Python面面观

共 981字,需浏览 2分钟

 · 2021-02-25

抽样被广泛应用在各个领域,比如对项目进行用户调研。因为实际工作中,使用全量数据进行数据挖掘十分消耗资源,因此基本都是利用从总体中抽取样本,对样本数据进行描述和推断,得到总体的特征。接下来简单说下 Hive 中提供了几种抽样功能:随机抽样、分组抽样和分桶抽样。

简单随机抽样

随机选取 100 名

Hive 中使用 rand() 进行简单随机抽样,limit 限制随机抽样返回的数量,rand() 函数可以配合 order by rand() 、sort by rand() 、distribute by rand() 作为排序过滤。

# 随机抽样100名
select  
    b.uid 
from  
(select   
 u.uid 
FROM  user  AS u 
order by rand(123)  #123为随机种子
limit 100 
)b

随机抽取 10% 的数据

rand() 函数产生一个 0 到 1 的随机数字,例如 rand()  between 0 and 0.1 为抽取总体数据 10% 的数据,如果需要抽取 0 到 1000000 之间的随机整数,可更换数据格式为 cast(rand() * 1000000 as int) 。

# 取10%的数据
select 
    count(b.uid) 
from 
(select  
 u.uid, 
 rand() cc 
FROM  user AS u
)b 
where b.cc between 0 and 0.1

分组抽样

Hive 中分组抽样借助 row_number() 函数实现,例如每个城市的用户抽取 100 人,按照城市分组排序。

# 分组抽样
select  
    b.city, 
    count(b.uid) 
from 
(SELECT 
     u.uid , 
     u.city, 
     row_number()over(PARTITION BY u.city order by rand()) as rn 
FROM  user AS u 
) b  
where b.rn <= 100 
group by b.city

分桶抽样

hive 中分桶依据 hash 取模,根据 hash 结果取余数(hash(id) % N),对应的编号为 0 到 N-1。比如将 user 表按照 ID 分成 10 个桶,其算法是 hash(id) % 10,hash(id) % 100 = 0 的数据被放到第一个桶中,hash(id) % 10 = 1的记录被放到第二个桶中。分桶抽样语法:TABLESAMPLE (BUCKET x OUT OF y [ON colname]) x 为要抽样的桶编号,y 表示桶的数量,桶编号从 1 开始,colname 表示抽样的列。

# 将表随机分成10组,抽取其中的第一个桶的数据
SELECT COUNT(1
FROM user TABLESAMPLE(BUCKET 1 OUT OF 10 ON id);


浏览 174
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报