关于hive:Hive实现数据抽样的三种方法

44次阅读

共计 1111 个字符,预计需要花费 3 分钟才能阅读完成。

在大规模数据量的数据分析及建模工作中,往往针对全量数据进行开掘剖析时会非常耗时和占用集群资源,因而个别状况下只须要抽取一小部分数据进行剖析及建模操作。Hive 提供了数据取样(SAMPLING)的性能,可能依据肯定的规定进行数据抽样,目前反对数据块抽样,分桶抽样和随机抽样,具体如下所示:

1. 数据块抽样(tablesample() 函数)

1)tablesample(n percent) 依据 hive 表数据的大小按比例抽取数据,并保留到新的 hive 表中。如:抽取原 hive 表中 10% 的数据
(留神:测试过程中发现,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)

2. 分桶抽样

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())

  1. 随机抽样(rand() 函数)

1)应用 rand() 函数进行随机抽样,limit 关键字限度抽样返回的数据,其中 rand 函数前的 distribute 和 sort 关键字能够保证数据在 mapper 和 reducer 阶段是随机散布的,案例如下:

select * from table_name where col=xxx distribute by rand() sort by rand() limit num;

2)应用 order 关键词

案例如下:

select * from table_name where col=xxx order by rand() limit num;

经测试比照,千万级数据中进行随机抽样 order by 形式耗时更长,大概多 30 秒左右。

关键词:大数据培训

正文完
 0