内容简介:最近在做Hive的数据抽样,基于以下考虑:要求:
最近在做Hive的数据抽样,基于以下考虑:
-
效率:数据量大的时候,可以给Hive 的使用者提供抽样数据,供他们开发、测试,提高效率。
-
安全:有些场景,不便于提供全量数据给开发者,但是又不能影响建模效果,这时,就需要随机抽样数据给开发者。
要求:
-
随机
-
抽取数据量可控
-
分区信息需要保留,数据整体随机,分区内也要随机
1. 抽样方案
1.1 方案一:Block Sampling
Hive 本身提供了抽样函数,使用TABLESAMPLE 抽取指定的 行数/比例/大小 ,举例:
CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE(1000 ROWS); CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE (20 PERCENT); // 测试未生效 CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE(1M); // 测试未生效
缺点: 不随机 。该方法实际上是按照文件中的顺序返回数据,对分区表,从头开始抽取,可能造成只有前面几个分区的数据。
优点:速度快。
1.2 方案二:分桶表抽样 (Smapling Bucketized Table)
利用分桶表,随机分到多个桶里,然后抽取指定的一个桶。举例:随机分到10个桶,抽取第一个桶。
CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
优点:随机,测试发现,速度比方法3的
rand()
快。
1.3 方案三:随机抽样 rand
原理:利用
rand()
函数进行抽取,
rand()
返回一个0到1之间的double 值。
法1
CREATE TABLE XXX AS
SELECT * FROM YYY
ORDER BY rand()
limit 10000
此时,可以提供真正的随机抽样,但是,需要在单个
reducer
中进行总排序,
速度慢
。
法2
CREATE TABLE XXX AS
SELECT * FROM YYY
SORT BY rand()
limit 10000
Hive 提供了
sort by
,
sort by
提供了单个
reducer
内的 排序 功能,但不保证整体有序,上面的语句是 不保证随机性
的。
法3
CREATE TABLE XXX AS
SELECT * FROM YYY
where rand()<0.002
distribute by rand()
sort by rand()
limit 10000;
where
条件首先进行一次
map
端的优化,减少
reducer
需要处理的数据量,提高速度。
distribute by
将数据随机分布,然后在每个
reducer
内进行随机排序,最终取10000条数据(如果数据量不足,可以提高
where
条件的
rand
过滤值)。
缺点: 速度慢
法4
CREATE TABLE XXX AS
SELECT * FROM YYY
where rand()<0.002
cluster by rand()
limit 10000;
cluster by
的功能是
distribute by
和
sort by
的功能相结合,在上面的例子中,
distribute by rand() sort by rand()
进行了两次随机,
cluster by rand()
仅一次随机,那么,会影响最终的抽样结果吗?
2. 分区
但是,上面的方法,会 丢失掉分区信息 !
所以,需要结合动态分区:
-
step1: create table
-
step2: 利用动态分区,插入select 出来的结果。
set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE XXX partition(thedate) SELECT * FROM YYY TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Apache Modules with Perl and C
Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95
Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!