Hive 随机取样-抽样查询

背景

在大规模数据量的数据分析及建模任务中,往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源,因此一般情况下只需要抽取一小部分数据进行分析及建模操作
Hive提供了数据取样(SAMPLING)的功能,能够根据一定的规则进行数据抽样,目前支持数据块抽样分桶抽样随机抽样,具体如下所示:

  1. 随机抽样(rand()函数)
  • 使用rand()函数进行随机抽样,limit关键字限制抽样返回的数据,其中rand()函数前的distribute和sort关键字可以保证数据在mapper和reducer阶段是随机分布的
    例子:随机取表app.table_name并且日期是当天(datekey=‘2018-11-14’)100条数据
 select * from app.table_name where datekey='2018-11-14' distribute by rand() sort by rand() limit 100;  
  • 千万级数据中进行随机抽样 order by方式耗时更长(不可取)
    例子:随机取表100条数据
 select * from app.table_name order by rand() limit 100;

2、数据块抽样(tablesample()函数)

1) tablesample(n percent) 根据hive表数据的大小按比例抽取数据,并保存到新的hive表中。如:抽取原hive表中10%的数据 ,该方式允许Hive随机抽取N行数据,数据总量的百分比(n百分比)或N字节的数据。
语法:

SELECT * FROM <Table_Name> TABLESAMPLE(N PERCENT|ByteLengthLiteral|N ROWS) s;

(注意:测试过程中发现,select语句不能带where条件且不支持子查询,可通过新建中间表或使用随机抽样解决)

create table xxx_new as select * from xxx tablesample(10 percent) 

2)tablesample(n M) 指定抽样数据的大小,单位为M。
3)tablesample(n rows) 指定抽样数据的行数,其中n代表每个map任务均取n行数据,map数量可通过hive表的简单查询语句确认(关键词:number of mappers: x)

3、数据块抽样(Block sampling )

例:按数据量百分比抽样

SELECT name FROM employees TABLESAMPLE(10 PERCENT) a;

例:按数据大小采样

SELECT name FROM employees TABLESAMPLE(1M) a;

例:按数据行数采样

SELECT * FROM source TABLESAMPLE(10 ROWS);

3、桶表抽样(Bucket table sampling)

hive中分桶其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表table_1按照ID分成100个桶,其算法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。创建分桶表的关键语句为:CLUSTER BY语句。
分桶抽样语法:
TABLESAMPLE (BUCKET x OUT OF y [ON colname])
其中x是要抽样的桶编号,桶编号从1开始,colname表示抽样的列,y表示桶的数量。
例如:将表随机分成10组,抽取其中的第一个桶的数据

select * from table_01 tablesample(bucket 1 out of 10 on rand())

该方式是最佳化采样bucket表。RAND()函数也可以用来采样整行。如果采样列同时使用了CLUSTERED BY,使用TABLESAMPLE语句会更有效率。
语法:

SELECT * FROM <Table_Name> TABLESAMPLE(BUCKET <specified bucket number to sample> OUT OF <total number of buckets> ON [colname|RAND()]) table_alias;

示例:

SELECT * FROM employees TABLESAMPLE(BUCKET 2 OUT OF 4 ON RAND()) table_alias;
SELECT * FROM xxxxxx_uid_online_buck TABLESAMPLE(bucket 1 out of 2 on uid); 

4、总结

聚合和抽样,特别是聚合函数,在大数据处理过程中是处理数据的主要方法。通过自由的条件限制以及聚合函数组合,基本能完成任意要求的数据处理或分组,随机抽样、数据块抽样、分桶抽样 是三种比较常见的数据抽样方式。

发布了175 篇原创文章 · 获赞 76 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_29232943/article/details/104636172
今日推荐