Hive随机抽样
抽样被广泛应用在各个领域,比如对项目进行用户调研。因为实际工作中,使用全量数据进行数据挖掘十分消耗资源,因此基本都是利用从总体中抽取样本,对样本数据进行描述和推断,得到总体的特征。接下来简单说下 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);
评论