3Hive数据抽样

3Hive数据抽样

  • [1 随机抽样](#1 随机抽样)
  • [2 块抽样](#2 块抽样)
  • [3 桶表抽样](#3 桶表抽样)

当数据规模不断膨胀时,我们需要找到一个数据的子集来加快数据分析效率。因此我们就需要通过筛选和分析数据集为了进行模式 & 趋势识别。目前来说有三种方式来进行抽样:随机抽样,桶表抽样,和块抽样。

1 随机抽样

关键词:rand()函数。

使用rand()函数进行随机抽样,limit关键字限制抽样返回的数据,其中rand函数前的distribute和sort关键字可以保证数据在mapper和reducer阶段是随机分布的。

案例如下:

javascript 复制代码
select * from table_name 
where col=xxx 
distribute by rand() sort by rand() 
limit num; 

使用order 关键词:

案例如下:

javascript 复制代码
select * from table_name 
where col=xxx 
order by rand() 
limit num; 

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

2 块抽样

关键词:tablesample()函数。

1.tablesample(n percent) 根据hive表数据的大小按比例抽取数据,并保存到新的hive表中。如:抽取原hive表中10%的数据

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

javascript 复制代码
select * from xxx tablesample(10 percent) 数字与percent之间要有空格

2.tablesample(nM) 指定抽样数据的大小,单位为M。

javascript 复制代码
select * from xxx tablesample(20M) 数字与M之间不要有空格

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

javascript 复制代码
select * from xxx tablesample(100 rows) 数字与rows之间要有空格

3 桶表抽样

关键词:tablesample (bucket x out of y [on colname])。

其中x是要抽样的桶编号,桶编号从1开始,colname表示抽样的列,y表示桶的数量。

hive中分桶其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表table_1按照ID分成100个桶,其算法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。创建分桶表的关键语句为:CLUSTER BY语句。

例如:将表随机分成10组,抽取其中的第一个桶的数据:

javascript 复制代码
select * from table_01 
tablesample(bucket 1 out of 10 on rand())
相关推荐
工作中的程序员18 小时前
hive sql优化基础
hive·sql
风跟我说过她1 天前
Sqoop的安装与配置
hive·hadoop·经验分享·centos·hbase·sqoop
DashingGuy6 天前
hive、spark任务报错或者异常怎么排查以及定位哪段sql
hive·sql·spark
秦JaccLink9 天前
Hive语句执行顺序详解
数据仓库·hive·hadoop
AI算力网络与通信9 天前
大数据领域 Hive 数据仓库搭建实战
大数据·数据仓库·hive·ai
工业互联网专业12 天前
基于大数据hive的银行信用卡用户的数仓系统的设计与实现_django
大数据·hive·django·毕业设计·源码·课程设计·数仓系统
顧棟12 天前
【Hive实战】hive-testbench的调研
数据仓库·hive·hadoop
emmm...13 天前
hive连不上,报错9000拒绝连接
数据仓库·hive·hadoop
野老杂谈13 天前
Hive SQL 中的时间戳转换详解
hive·hadoop·sql
大数据CLUB13 天前
基于hive和mapreduce的地铁数据分析及可视化_hive作为数据库
大数据·hive·hadoop·分布式·数据分析·mapreduce