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;