Hive分桶之BUCKET详解
Bucket
1.对于每一个表(table)或者分区(partition), Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
2,把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。
具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。
比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。
那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,
如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
下面来一个例子:
Create table dz_test(id bigint comment’编号’,(ps:comment为注释)name string comment’姓名’
)comment’编号与姓名表’
Partitioned by(pdate string)
Clustered by(id) 按id分桶,自动哈希分桶
Sorted by(id) 按id排序
Into 4 buckets 分成4个桶
Row format delimited 设置创建的表在加载数据的时候,支持的列分隔符
Fields terminated by ‘\t’ 每个字段按\t分割
Lines terminated by’\n’ stored as textfile; 按\n为断行符,指定导入的文件为纯文本。
Hive本身支持的文件格式只有:Text File,Sequence File,如果数据需要压缩,使用 [STORED AS SEQUENCE]
下面load数据:
插入数据之前需要设置参数hive.enforce.bucketing=true,以强制hive的reducer数目为分桶数。
如果不设置这个hive参数,最后的桶个数可能不是建表语句中的个数。
另外,也可以通过将参数mapred.reduce.tasks设置为桶的数目来控制reducer的数目,建议采用第一种方式。
Set hive.enforce.bucketing=true;
Load data local inpath’/home/Hadoop/….’ overwrite into table dz_test partition(pdate=‘2015-10’)
物理上,每个桶就是表(或分区)目录里的一个文件。它的文件名并不重要,但是桶 n 是按照字典序排列的第 n 个文件。
事实上,桶对应于 MapReduce 的输出文件分区:一个作业产生的桶(输出文件)和reduce任务个数相同。
我们可以通过查看刚才 创建的bucketd_users表的布局来了解这一情况。运行如下命令:
查看表的结构:
hive> dfs -ls /user/hive/warehouse/dz_test;
将显示有4个新建的文件。文件名如下(文件名包含时间戳,由Hive产生,因此 每次运行都会改变):
attempt_201701221636_0016_r_000000_0
attempt_201701221636_0016_r-000001_0
attempt_201701221636_0016_r_000002_0
attempt_201701221636_0016_r_000003_0
第一个桶里包括用户ID和4,因为一个INT的哈希值就是这个整数本身,在这里 除以桶数(4)以后的余数:2
读取数据,看每一个文件的数据:
hive> dfs -cat /user/hive/warehouse/dz_test/*0_0;
0 Nat
4 Ann
用TABLESAMPLE子句对表进行取样,我们可以获得相同的结果。这个子句会将 查询限定在表的一部分桶内,而不是使用整个表:
. 对桶中的数据进行采样:
hive> SELECT * FROM dz_test
>TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);
0 Nat
4 Ann
桶的个数从1开始计数。因此,前面的查询从4个桶的第一个中获取所有的用户。
对于一个大规模的、均匀分布的数据集,这会返回表中约四分之一的数据行。
我们也可以用其他比例对若干个桶进行取样(因为取样并不是一个精确的操作,因此这个 比例不一定要是桶数的整数倍)。
例如,下面的查询返回一半的桶:
7. 查询一半返回的桶数:
hive> SELECT * FROM dz_test
> TABLESAMPLE(BUCKET 1 OUT OF 2 ON id);
0 Nat
4 Ann
2 Joe
因为查询只需要读取和TABLESAMPLE子句匹配的桶,所以取样分桶表是非常高效 的操作。
如果使用rand()函数对没有划分成桶的表进行取样,即使只需要读取很 小一部分样本,也要扫描整个输入数据集:
hive〉 SELECT * FROM dz_test
> TABLESAMPLE(BUCKET 1 OUT OF 4 ON rand());
2 Doe
①从Hive 0.6.0开始,对以前的版本,必须把mapred.reduce .tasks设为表中要填 充的桶的个数。
如果桶是排序的,还需要把hive.enforce.sorting设为true。
②显式原始文件时,因为分隔字符是一个不能打印的控制字符,因此字段都挤在一起。
https://blog.csdn.net/m0_37534613/article/details/55258928
Hive分桶之BUCKET详解相关推荐
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 大数据学习笔记42:Hive - 分桶表
文章目录 一.Hive分桶表 1.分桶操作 2.分桶原理 3.注意事项 二.分桶表案例演示 1.创建数据文件courses.txt 2.将数据文件上传到HDFS的/bucket目录 3.基于/buck ...
- Hive分桶(bucket)
一 什么是桶的概念,和分区有啥区别? 对于每一个表或者分区,可以进一步细分成桶,桶是对数据进行更细粒度的划分.默认时对某一列进行hash,使用hashcode对 桶的个数求模取余,确定哪一条记录进入哪 ...
- HIVE-分桶表的详解和创建实例
我们学习一下分桶表,其实分区和分桶这两个概念对于初学者来说是比较难理解的.但对于理解了的人来说,发现又是如此简单. 我们先建立一个分桶表,并尝试直接上传一个数据 create table studen ...
- hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25
1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...
- 大数据之hive:hive分桶表
目录 一.回顾分区表 二.为什么分桶? 三.分桶表的使用 1.创建一个带分桶定义的表(分桶表) 2.加载数据: 3.对分桶表的查询 分桶总结: 实例 一.回顾分区表 为什么有分区? 随着系统运行时间增 ...
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...
- 全方位揭秘!大数据从0到1的完美落地之Hive分桶
分桶的概述 为什么要分桶 数据分区可能导致有些分区数据过多,有些分区数据极少.分桶是将数据集分解为若干部分(数据文件)的另一种技术. 分区和分桶其实都是对数据更细粒度的管理.当单个分区或者表中的数据越 ...
- Hive 分桶表原理及优化大表 join 实战
一.什么是分桶表 分桶表,比普通表或者分区表有着更为细粒度的数据划分. 举个例子,每天产生的日志可以建立分区表,每个分区在 hdfs 上就是一个目录,这个目录下包含了当天的所有日志记录. 而分桶表,可 ...
最新文章
- cmake通过命令行构建静态库/动态库
- 尝试引用已删除的函数_学Excel函数公式,你必须要掌握这些知识
- java 返回js_如何基于java或js获取URL返回状态码
- 汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...
- 变电站计算机在线监控系统,变电站环境在线监测系统
- 微信官方回应iOS 13.2频繁杀后台问题:建议先不升级
- odbc数据源的配置
- 计算机的神奇功能华为,接上线就变PC!华为Mate 10的电脑模式究竟好用不?
- 微信小游戏破解(2)之《我要猫咪》
- 矢量网络分析仪VNA的校准之SOLT方法
- android wifi热点setting
- EPICS -- pyDevice
- 「2020年大学生电子设计竞赛分享」电源题,省一等奖!
- python爬取QQ空间好友说说并生成词云
- U盘Linux启动引导
- matlab对信号的滤波方法
- 干货!基于层次适应的零样本学习
- 嵌入式 Linux 开发工具篇问题整理//C语言测试(杨辉三角、递归调用实现阶乘、计算器、统计字符串出现次数)//2018.07.12.//
- 安霸S2LM系列SD卡支持
- LiFi比WiFi快100倍:它如何运作,实际应用靠谱吗