HIVE数据抽样

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HIVE数据抽样相关的知识,希望对你有一定的参考价值。

参考技术A 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;

sql Hive数据抽样表抽样(不推荐)

-- 注意: 取样的时候关键字TABLESAMPLE必须紧跟源表名(不能跟在子查询的表名后)
-- TABLESAMPLE仅支持全表取样, 不支持源后面带任何条件

-- 按行数取样
SELECT * FROM fdm.fdm_szad_w_ad_info_day TABLESAMPLE(1000 ROWS) WHERE ftime='20180426';
-- 按数据大小(单位为M)取样(仅支持CombineHiveInputFormat)
SELECT * FROM fdm.fdm_szad_w_ad_info_day TABLESAMPLE(30M) WHERE ftime='20180426';
-- 按数据大小的百分比来取样(仅支持CombineHiveInputFormat)
SELECT * FROM fdm.fdm_szad_w_ad_info_day TABLESAMPLE(10 PERCENT) WHERE ftime='20180426';

以上是关于HIVE数据抽样的主要内容,如果未能解决你的问题,请参考以下文章

sql Hive数据抽样表抽样(不推荐)

#yyds干货盘点#Hive数据抽样与存储格式详解

复习 | HIVE 随机采样②

Hive中的桶表入门(适用于抽样查询)

算子:sample(false, 0.1)抽样数据

Hive实现从表中随机抽样得到一个不重复的数据样本