HIVE数据抽样

hive 提供数据抽样功能,根据一定的规则进行数据抽样,目前支持三种抽样:

1、数据块抽样 tablesample()函数(hive0.8版本及以上支持)

tablesample(n percent) : 按照hive表的数据量比例抽样数据

select * from table_name tablesample(0.1 percent) s

tablesample(n M) :指定抽样数据的大小,单位为M

tablesample(n rows):指定抽样数据的行数,n表示每个map task均取n行数据

2、分桶抽样 

hive分桶是根据分桶字段做hash取模,放入指定的数据的桶中,比如表a的字段id分成10个桶,那hash(id)%10=0的数据放在第一个桶,hash(id)%10=1的数据放在第二个桶中

语法:tablesample(bucket x out of y [on colname]) :x 是要抽样的桶编号,桶编号从1开始,colname表示要抽样的列,y表示桶的数量,例如:

select * from tb tablesample(bucket 1 out of 10 on rand())  -- 表随机分成10桶,抽取第一个桶的数据做为样本

hive中分桶其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表table_1按照ID分成100个桶,其算法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。创建分桶表的关键语句为:CLUSTER BY语句。

3、随机抽样 rand()函数

使用rand()函数进行随机抽样,limit限制抽样返回的数据

比如:一百万的行数据中,有10万客户,随机抽取1%的客户作为样本

select * from tb where cust_no is not null distribute by rand() sort by rand() limit 10000;

select * from tb where cust_no is not null order by rand() limit 10000;

select * from 

( select *,cast(rand()*10000 as bigint) as rownum from tb where cust_no is not null ) t 

order by rownum  limit 10000;

你可能感兴趣的:(HIVE数据抽样)