Hive 桶的分区
(一)、桶的概念:
对于每一个表(table)或者分区, Hive可以进一步组织成桶(没有分区能分桶吗?),
也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用
对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)、获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用
这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用
Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个
相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可
以,可以大大较少JOIN的数据量。
(2)、使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,
如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
(3)、强制多个 reduce 进行输出:
插入数据前需设置,不设置将会只有一个文件:
set hive.enforce.bucketing = true
要向分桶表中填充数据,需要将 hive.enforce.bucketing 属性设置为 true。
这 样,Hive 就知道用表定义中声明的数量来创建桶。然后使用 INSERT 命令即可。
需要注意的是: clustered by和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据如何如何导入,包括数据的分桶和排序。
'set hive.enforce.bucketing = true' 可以自动控制上一轮reduce的数量从而适配bucket的个数,
当然,用户也可以自主设置mapred.reduce.tasks去适配bucket个数,推荐使用'set hive.enforce.bucketing = true'
二、案例操作
1、以用户ID作为分桶依据,将用户数据分4个桶存放
创建普通表:
create table if not exists u_users(
uid int,
uname string,
uage int
)
row format delimited fields terminated by',';
vi u_users.txt
1,xiaoA,12
2,xiaoB,10
3,xiaoC,12
4,xiaoD,17
5,xiaoE,12
6,xiaoF,16
7,xiaoG,15
8,xiaoH,12
9,xiaoW,12
10,xiaoT,12
11,xiaoL,18
load data local inpath '/opt/data/u_users.txt' into table u_users;
创建分桶表(用户ID作为分桶依据):
create table if not exists bk_users(
uid int,
uname string,
uage int
)
clustered by(uid) into 4 buckets
row format delimited fields terminated by',';
说明:
1.clustered by(uid) into 4 buckets 在row format delimited fields terminated by','前面,顺序不能调
2.clustered by(uid) into 4 buckets 是以表的uid作为分桶依据,然后将数据分为4个桶操作。
强制多个 reduce 进行输出桶文件
set hive.enforce.bucketing = true
加载数据到分桶表:
注意:对分桶表数据的导入只能以结果集的方式添加
insert into table bk_users select * from u_users;
查看分桶表目录下的桶文件:
hive> dfs -ls hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users;
Found 4 items
-rwxr-xr-x 3 root supergroup 22 2017-04-24 14:49 hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000000_0
-rwxr-xr-x 3 root supergroup 33 2017-04-24 14:49 hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000001_0
-rwxr-xr-x 3 root supergroup 34 2017-04-24 14:49 hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000002_0
-rwxr-xr-x 3 root supergroup 34 2017-04-24 14:49 hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000003_0
hive> dfs -cat hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000000_0;
8,xiaoH,12
4,xiaoD,17
hive> dfs -cat hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000001_0;
9,xiaoW,12
5,xiaoE,12
1,xiaoA,12
hive> dfs -cat hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000002_0;
10,xiaoT,12
6,xiaoF,16
2,xiaoB,10
hive> dfs -cat hdfs://Hadoop001:9000/user/hive/warehouse/db_1608c.db/bk_users/000003_0;
11,xiaoL,18
7,xiaoG,15
3,xiaoC,12
分桶表的查询:
select * from bk_users;
tablesample是桶抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
select * from bk_users TABLESAMPLE(BUCKET x OUT OF y);
y尽可能是table总bucket数的倍数或者因子。
y必须要大于x,否则报错。
hive根据y的大小,决定抽样的比例;
clustered by(id) into 16 buckets;
例如,table总共分了16桶,当y=8时,抽取(16/8=)2个bucket的数据,
当y=32时,抽取(16/32=)1/2个bucket的数据。
x表示从哪个bucket开始抽取。
clustered by(id) into 32 buckets;
例如,table总bucket数为32,tablesample(bucket 3 out of 16),
表示总共抽取(32/16=)2个bucket的数据,
分别为第3个bucket和第(3+16=)19个bucket的数据。
bk_users分桶结构:clustered by(uid) into 4 buckets
#从bk_users分桶表抽出一桶数据:
x=2,y=4
select * from bk_users TABLESAMPLE(BUCKET 2 OUT OF 4);
#从bk_users分桶表抽出二桶数据:
x=2,y=2
select * from bk_users TABLESAMPLE(BUCKET 2 OUT OF 2);
#从bk_users分桶表抽出四桶数据:
x=1,y=1
select * from bk_users TABLESAMPLE(BUCKET 1 OUT OF 1);
#从bk_users分桶表抽出半桶数据:
x=1,y=8
select * from bk_users TABLESAMPLE(BUCKET 1 OUT OF 8);
=================抽样查询======================
#随机从某表中取5条数据:
select * from u_users order by rand() limit 5;
#数据块取样 (TABLESAMPLE (n PERCENT))抽取表大小的n%
select * from u_users TABLESAMPLE (10 PERCENT);
#指定数据大小取样(TABLESAMPLE (nM)) M为MB单位
select * from u_users TABLESAMPLE (10M);
#指定抽取条数(TABLESAMPLE (n ROWS))
select * from u_users TABLESAMPLE (5 ROWS);
************分区+分桶+混合方式分区******************************
案例2:按国家、城市分桶,以f1字段作为分桶依据
create external table if not exists tb_part_bk_users(
f1 string,
f2 string,
f3 string,
contry string,
city string
)
row format delimited fields terminated by'\t';
load data local inpath '/opt/data/par_buc.txt' into table tb_part_bk_users;
创建分区+分桶表:
create external table if not exists part_bk_users(
f1 string,
f2 string,
f3 string
)
partitioned by(contry string,city string)
clustered by(f1) into 5 buckets
row format delimited fields terminated by'\t';
说明:
1.partitioned by(contry string,city string)
clustered by(f1) into 5 buckets
先写分区操作、在设置分桶操作
混合方式将数据添加到分区分桶表:
1.打开动态分区设置、设置动态分区模式为非严格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
2.强制多个 reduce 进行输出桶文件
set hive.enforce.bucketing = true
3.只能以结果集的方式添加数据到分桶表
insert into table part_bk_users partition(contry='CA',city)
select f1,f2,f3,city from tb_part_bk_users where contry='CA';
insert into table part_bk_users partition(contry='US',city)
select f1,f2,f3,city from tb_part_bk_users where contry='US';
Hive 桶的分区的更多相关文章
- HIVE—索引、分区和分桶的区别
一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...
- 【Hive学习之五】Hive 参数&动态分区&分桶
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- hive 桶相关特性分析
1. hive 桶相关概念 桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作. 抽样( sampling )可以在全体数 ...
- Hive的动态分区
关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition), ...
- 分析Hive表和分区的统计信息(Statistics)
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...
- Hive中静态分区和动态分区总结
目录 背景 第一部分 静态分区 第二部分 动态分区 第三部分 两者的比较 第四部分 动态分区使用的问题 参考文献及资料 背景 在Hive中有两种类型的分区:静态分区(Static Partitioni ...
- Hive和Spark分区策略
1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...
- 什么是hive的静态分区和动态分区,它们又有什么区别呢?hive动态分区详解
面试官问我,什么是hive的静态分区和动态分区,这题我会呀. 简述 分区是hive存放数据的一种方式,将列值作为目录来存放数据,就是一个分区,可以有多列. 这样查询时使用分区列进行过滤,只需根据列值直 ...
- Hive里的分区、分桶、视图和索引再谈
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
随机推荐
- 关于ng的路由的几点想法(ui-view)
在配置路由的时候,我们可以选择ng框架自带的路由,也可以使用第三方路由插件ui-router 注意: (1)在使用angular-ui-router的时候,必须先引入angular-ui-router ...
- Excel公式-求最低价网站名字
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- Gson解析复杂的Bean类实现Parcelable
import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; import android.s ...
- Adroid学习之 从源码角度分析-禁止使用回退按钮方案
有时候,不能让用户进行回退操作,如何处理? 查看返回键触发了哪些方法.在打开程序后把这个方法禁止了. 问题:程序在后台驻留,这样就会出现,其他时候也不能使用回退按钮.如何处理,在onpase()时方法 ...
- Python 多进程概述
multiprocessing python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包mult ...
- Java 中的 String 类常用方法
字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. Strin ...
- 使用NPOI写入Excel数据(ASP.NET)
第一次做这个写入数据的功能,研究了下npoi的类 IWorkbook wb = new HSSFWorkbook(); //创建表 ISheet sh = wb.CreateSheet("X ...
- DHTMLX 修改方法加参数
dhtmlx下拉框选项过长,导致显示不全,所以在下拉框里加了title 具体方法如下: dhtmlXCombo.prototype.modes.checkbox.render=function(c, ...
- C++ 头文件系列(system_error)
1.为什么system_error "....report error conditions originating from the operating system or low-lev ...
- javaweb项目-医者天下 (Spring+SpringMVC+MyBatis)
项目下载地址:http://download.csdn.net/detail/qq_33599520/9826683 项目完整结构图: 项目简介: 医者天下项目是一个基于Spring+SpringMV ...