(一)、桶的概念:
对于每一个表(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 桶的分区的更多相关文章

  1. HIVE—索引、分区和分桶的区别

    一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...

  2. 【Hive学习之五】Hive 参数&动态分区&分桶

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  3. hive 桶相关特性分析

    1. hive 桶相关概念     桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作.     抽样( sampling )可以在全体数 ...

  4. Hive的动态分区

    关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition), ...

  5. 分析Hive表和分区的统计信息(Statistics)

    类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...

  6. Hive中静态分区和动态分区总结

    目录 背景 第一部分 静态分区 第二部分 动态分区 第三部分 两者的比较 第四部分 动态分区使用的问题 参考文献及资料 背景 在Hive中有两种类型的分区:静态分区(Static Partitioni ...

  7. Hive和Spark分区策略

    1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...

  8. 什么是hive的静态分区和动态分区,它们又有什么区别呢?hive动态分区详解

    面试官问我,什么是hive的静态分区和动态分区,这题我会呀. 简述 分区是hive存放数据的一种方式,将列值作为目录来存放数据,就是一个分区,可以有多列. 这样查询时使用分区列进行过滤,只需根据列值直 ...

  9. Hive里的分区、分桶、视图和索引再谈

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

随机推荐

  1. 学习smart gwt 的一些好的网站

    最近在学smart gwt,这个框架和我们比较熟悉的SSH实现思路上有点不一样,因为技术是外国的,所以好多东西都是英文的,正因为是英文的,我们学到的东西才是最多最好的,好了,网站如下: gwt api ...

  2. 20155237 2016-2017-2 《Java程序设计》第5周学习总结

    20155237 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 语法与继承架构 使用try...catch 与C语言中程序流程和错误处理混在一起不同,Jav ...

  3. XAF-通知模块概述 web+win

    通知模块概述 1.支持 WinForms和ASP.NET程序. 2.支持调度模块或自定义业务对象. 3.功能:在指定的时间,弹出一个窗口,用户可以查看提醒.也可以取消或推迟. 如需演示项目的源码,可以 ...

  4. 老李分享:DBA

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  5. Android 微信第三方登录

    步骤一 微信开发者平台 我开始的解决思路是,去微信开发者平台看API文档. 这个API文档的主要意思呢,有三点: 1.你得下载这几样东西(下载链接),一个是他的范例代码,一个是他的签名生成工具. 2. ...

  6. php Redis常用命令

    redis是一个很好的缓存工具,下面我们就来介绍一下他怎么使用 启动 Redis 服务src/redis-server或者src/redis-server redis.conf src/Redis-s ...

  7. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  8. jmeter 登录并发 (此文章有待修改)

    1.先通过录制通过取样器找到所需要的请求.并新建添加至线程组,也可以根据以下样式找到所需请求.复制添加至线程组 寻找请求 添加后 2.添加CSV配置元件 3.填写CSV参数 4.修改参数.这是格式:& ...

  9. ios ALAssetsLibrary简单的使用

    关于ALAssetsLibrary的简单使用有两个方面: 第一:存储图片/视频方法如下: // With a UIImage, the API user can use -[UIImage CGIma ...

  10. swust oj(0088)表达式的转换

    表达式的转换(0088) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 435 Accepted: 93 Accepted 16级卓 ...