Hive 数据抽样 详解

只需要抽取一小部分数据进行分析及建模操作。下面介绍 Hive 中三种数据抽样的方法 :
1> 块抽样 (Block Sampling) : Hive 本身提供了抽样函数,使用 TABLESAMPLE 抽取指定的 行数/比例/大小

CREATE TABLE iteblog AS SELECT * FROM iteblog1 tablesample(1000 ROWS); -- 数字与 rows 之间要有空格
CREATE TABLE iteblog AS SELECT * FROM iteblog1 tablesample(20 PERCENT); -- 数字与 percent 之间要有空格
CREATE TABLE iteblog AS SELECT * FROM iteblog1 tablesample(1M); -- 数字与 M 之间不要有空格

缺点 : 不随机。该方法实际上是按照文件中的顺序返回数据,对分区表,从头开始抽取,可能造成只有前面几个分区的数据
优点 : 速度快

2> 分桶表抽样 (Smapling Bucketized Table) : 利用分桶表,随机分到多个桶里,然后抽取指定的一个桶。举例 : 随机分到10个桶,抽取第一个桶

CREATE TABLE iteblog AS
SELECT *
FROM iteblog1
tablesample(BUCKET 1 OUT OF 10 ON rand());

优点 : 随机,测试发现,速度比方法 3 的 rand() 快

3> 随机抽样 (Random() Sampling) : 利用 rand() 函数进行抽取,rand() 返回一个0到1之间的 double 值
使用方法1> 提供真正的随机抽样,但是,需要在单个 reducer 中进行总排序,速度慢

CREATE TABLE iteblog AS
SELECT * FROM iteblog1
ORDER BY rand()
LIMIT 10000

使用方法2> Hive 提供 sort by,sort by 提供了单个 reducer 内的排序功能,但不保证整体有序,下面的语句是不保证随机性的

CREATE TABLE iteblog AS
SELECT * FROM iteblog1
SORT BY rand()
LIMIT 10000

使用方法3> WHERE条件首先进行一次 map 端的优化,减少 reducer 需要处理的数据量,提高速度。DISTRIBUTE BY 将数据随机分布,然后在每个 reducer 内进行随机排序,最终取 10000条数据 (如果数据量不足,可以提高 where 条件的 rand 过滤值)

CREATE TABLE iteblog AS
SELECT * FROM iteblog1
WHERE rand()<0.002
DISTRIBUTE BY rand()
SORT BY rand()
LIMIT 10000;

缺点 : 速度慢

使用方法4> cluster by 的功能是 distribute by 和 sort by 的功能相结合,DISTRIBUTE BY rand() SORT BY rand() 进行了两次随机,CLUSTER BY rand() 仅一次随机,所以速度上会比上一种方法快

CREATE TABLE iteblog AS
SELECT * FROM iteblog1
WHERE rand()<0.002
CLUSTER BY rand()
LIMIT 10000;

随机结果里面添加分区 : 上面的几种方法会丢失掉分区信息,可以结合动态分区将分区信息加到结果集中

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE iteblog partitin(thedate)
SELECT *
FROM iteblog1
TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值