1. hive 桶相关概念
桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作。
抽样(
sampling
)可以在全体数据上进行采样,这样效率自然就低,它还是要去访问所有数据。而如果一个表已经对某一列制作了bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量。
2. 桶作用
1)数据抽样
2)提升某些查询操作效率,如:mapside join
3. 桶的使用
--场景一、场景二使用此表说明
以id来划分桶,测试是否可以直接使用load将数据放入相关的桶中。
create table tb_user (id int ,name string,age int) partitioned by (timeflag bigint) clustered by (id) sorted by (age asc) into 4 buckets row format delimited fields terminated by ',';
测试数据:
[hadoop@mwtec-50 tmp]$ hadoop fs -cat /user/hive/warehouse2/tb_user/timeflag=130730/tb_user;
1,nat,18,130731
0,joe,19,130730
2,kay,14,130729
3,ann,18,130730
4,add,19,130730
5,ads,20,130821
6,dsf,19,130901
7,ll,19,130721
8,aas,15,130721
--场景七
使用name来划分桶,测试是否可以使用字符串进行划分。
create table tb_stu_1(id int,age int, name string,timeflag bigint) clustered by (name) sorted by (age) into 5 buckets row format delimited fields terminated by ',';
--其他场景:
使用id来划分桶,测试桶的一些特性。
create table tb_tmp(id int,age int, name string ,timeflag bigint) row format delimited fields terminated by ',';
create table tb_stu(id int,age int, name string,timeflag bigint) clustered by (id) sorted by (age) into 5 buckets row format delimited fields terminated by ',';
测试数据:
1,20,zxm,20130730
2, 21, ljz,20130730
3, 19, cds,20130730
4, 18, mac,20130730
5, 22, android,20130730
6, 23, symbian,20130730
7, 25, wp, 20130730
相关操作语句:
1. [hadoop@mwtec-50 tmp]$ vi tb_tmp
1,20,zxm,20130730
2, 21, ljz,20130730
3, 19, cds,20130730
4, 18, mac,20130730
5, 22, android,20130730
6, 23, symbian,20130730
7, 25, wp, 20130730
2. hadoop fs -put /tmp/tb_tmp /user/hadoop/output
3. load data inpath '/user/hadoop/output/tb_tmp' into table tb_tmp;
场景一: 使用load data inpath 进行导入
语句:
load data inpath '/user/hadoop/output/tb_user' into table tb_user partition(timeflag=130730);
注:使用load data时数据之间不能有空格,否则输入的数据会为null
执行结果:
结果分析:
直接使用load data inpath 不能自动分为四个桶,所有数据都在tb_user目录下。
场景二:先 set hive.enforce.bucketing = true; 再使用load data inpath 进行导入
注:退出hive客户端
语句:
set hive.enforce.bucketing = true;
load data inpath '/user/hadoop/output/tb_user' into table tb_user partition(timeflag=130730);
执行结果:
结果分析:
先 set hive.enforce.bucketing = true; 再使用load data inpath 进行导入 不能自动分为四个桶,所有数据都在tb_user目录下。
场景三:退出hive客户端后再进入hive客户端,不使用set hive.enforce.bucketing = true,使用insert into table 命令写数据至tb_stu表中。
语句:
insert into table tb_stu select id,age,name,timeflag from tb_tmp where timeflag=20130730 sort by age;
执行过程:
结果分析:
在没有set hive.enforce.bucketing = true时,只有一个job且查看hdfs时,只发现有一个目录,并非有5个目录。从而可知在执行桶的插入语句时需要先执行set hive.enforce.bucketing = true;
场景四:使用set hive.enforce.bucketing = true,使用insert into table 命令写数据至tb_stu表中。
语句:
insert into table tb_stu select id,age,name,timeflag from tb_tmp where timeflag=20130730 sort by age;
执行过程:
结果分析:
使用set hive.enforce.bucketing = true后,插入的语句的job数为2个,hdfs下有5个桶。
场景五:使用桶的抽样(
sampling)
语句:
select * from tb_stu tablesample(bucket 1 out of 5 on id);
执行过程:
结果分析:
用tablesample 子句对表进行取样,可以获得相同结果,这样子句将查询限定在表的一部分桶内,而不是使用整个表。如:上图所示,能被5求余得1的桶的所有数据将被查询出来。
场景六:使用桶的抽样(
sampling),且使用rand()函数
语句:
select * from tb_stu tablesample(bucket 1 out of 5 on rand());
执行过程:
结果分析:
查询只需要读取和tablesample子句匹配的桶,所取样分桶是非常高效的操作。如果使用rand()函数对没有划分成桶的表进行取样,即使只需要读取很小一部分样本,也要扫描整个输入数据集。
场景七:
语句:
insert into table tb_stu_1 select id,age,name,timeflag from tb_tmp;
相关结果:
结果分析:
hive表中分桶不仅可以使用数字也可以使用字符串进行桶。
总结分析:
1. 定义了桶,但要生成桶的数据,只能是由其他表通过insert into 或是insert overwrite ,若表有分区只能使用insert overwrite
2. 定义桶可以使用整型字段或是string类型字段
3. 若表没有定义桶也可以进行随机抽样
4. 必须先set hive.enforce.bucketing = true才可以将数据正常写入桶中
问题二、
此时建表语句为:
create table tb_stu(id int,age int, name string) partitioned by (timeflag bigint) clustered by (id) sorted by (age) into 4 buckets row format delimited fields terminated by ',';
使用:
insert into table partition(timeflag=130801) select id,age,name,timeflag from tb_tmp;
出现如下异常:
- [转帖]我最近研究了hive的相关技术,有点心得,这里和大家分享下。
我最近研究了hive的相关技术,有点心得,这里和大家分享下. https://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html 首 ...
- Hive(六)hive执行过程实例分析与hive优化策略
一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...
- MySQL · 特性分析 · 优化器 MRR & BKA【转】
MySQL · 特性分析 · 优化器 MRR & BKA 上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_ ...
- Kafka Producer相关代码分析【转】
来源:https://www.zybuluo.com/jewes/note/63925 @jewes 2015-01-17 20:36 字数 1967 阅读 1093 Kafka Producer相关 ...
- 初窥css---选择器及相关特性
选择器及相关特性 基础选择器 标签选择器 相当于全选,在我看来局限性较大,也没啥意义的感觉,用处不太大 id选择器 有利于对于某个小盒子的部分属性进行改变,但是若是需要改的小盒子很多的话,就会很麻烦 ...
- C#中的自定义控件中的属性、事件及一些相关特性的总结(转)
摘要: C#中的自定义控件中的属性(Property).事件(Event)及一些相关特性(Attribute)的总结 今天学习了下C#用户控件开发添加自定义属性的事件,主要参考了MSDN,总结并实 ...
- java8的相关特性
1,为什么要介绍java8的相关特性? 因为现在的企业大部分已经从java7向java8开始迈进了,用java8的公司越来越多了,java8中的一些知识还是需要了解一些的; java8具有以下特点: ...
- 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结
前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...
- Redis连接池的相关问题分析与总结
https://mp.weixin.qq.com/s/juvr89lAvM0uuDmyWyvqNA 阿里干货课堂丨Redis连接池的相关问题分析与总结 原创 技术僧 Java进阶与云计算开发 2018 ...
随机推荐
- 从VC到g++遇到的事
最近做的项目,需要把代码从VC移植到g++下编译,在这个过程中,遇到了几个平台相关的问题--在VC下顺利编译的代码,但在g++中编译报错. 这里贴出来给大家分享一下: 1. 枚举类型 问题代码 enu ...
- XFS:大数据环境下Linux文件系统的未来?
XFS:大数据环境下Linux文件系统的未来? XFS开发者Dave Chinner近日声称,他认为更多的用户应当考虑XFS.XFS经常被认为是适合拥有海量数据的用户的文件系统,在空间分配方面的可 ...
- 【图片处理】ImageMagick, gm
ImageMagick: Convert, Edit, Or Compose Bitmap Images http://www.imagemagick.org/script/binary-releas ...
- c++转换构造函数和类型转换函数
看stl源码时,有一段代码感觉很奇怪 iterator begin() { return (link_type)((*node).next); } iterator和link_type是两种不同类型, ...
- 考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)
分析:与poj的2778差不多的,求出来所有的情况然后减去不包含的就行了,这次使用了一下kuangbin的那种自动机写法,确实还不错,因为尤是在建立矩阵的时候更加方便. 代码如下: ======= ...
- B - The Suspects -poj 1611
病毒扩散问题,SARS病毒最初感染了一个人就是0号可疑体,现在有N个学生,和M个团队,只要团队里面有一个是可疑体,那么整个团队都是可疑体,问最终有多少个人需要隔离... 再简单不过的并查集,只需要不断 ...
- windows下计算文件的md和sha值
在windows下可以使用FCIV命令行工具计算文件的md5和sha值,具体例子如下: FCIV -md5 -sha1 path\filename.ext 例如: FCIV-md5-sha1 c:\w ...
- 高效的DDoS攻击探测与分析工具——FastNetMon
一.简介 FastNetMon这是一个基于多种抓包引擎(NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP)的DoS/DDoS攻击高效分析工具,可以探测和分析网络 ...
- 1031. Hello World for U (20)
题目链接:http://www.patest.cn/contests/pat-a-practise/1031 题目: 分析: 排版题.注意先计算好最后一排的字符数,然后计算前面几排的空格数.难度不大 ...
- linux 获取系统屏幕分辨率
在Windows下可以使用GetSystemMetrics(SM_CXSCREEN);GetSystemMetrics(SM_CYSCREEN) 获取. 在Linux下可以使用XDisplayWi ...