写点什么

大数据开发 Hive 之如何进行数据抽样

  • 2021 年 12 月 28 日
  • 本文字数:867 字

    阅读完需:约 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())
复制代码


3. 随机抽样(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 秒左右。

用户头像

关注尚硅谷,轻松学IT 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
大数据开发Hive之如何进行数据抽样