hive 建表,分桶表(clustered by)、分桶且桶内排序(clustered by+sorted by)、分区表(partitioned by)、分区分桶一起用
一、分桶表
1、建表语句
create table test_bucket_sorted (
id int comment 'ID',
name string comment '名字'
)
comment '测试分桶'
clustered by(id) sorted by (id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
上面建表指定了这张表分为四个桶。
2、原理:hive的分桶就是mapreduce的partition。
(1)原理:当insert插入数据到分桶表时,会把insert的sql转为mapreduce程序处理,而分桶表的桶数就是reducer的数量。
然后使用分桶键作为mapreduce的partition分区键,每条数据的分桶键的hash对桶数求余的值 就是这一条数据所属reducer的索引。
我们知道,每个reducer都会一个文件。所以上面例子中的桶数是四,那么insert插入数据到分桶表后,我们在该表的hdfs目录下可以看到新增了四个文件。。文件命名与reducer的输出文件命名风格一样。
(2)注意:
《1》默认情况下,当插入的数据量不大的时候,是不会分桶的。
然后我测试的数据就只有9条:
[root@hadoopTest ~]# cat data.txt
1 name1
2 name2
3 name3
4 name4
5 name5
6 name6
7 name7
8 name8
9 name9
先把这些数据放到中间表里,这样才能用insert...select
所以为了测试出效果,我们需要设置属性为强制分桶:set hive.enforce.bucketing=true;
这样的话我们的insert就会分为四个reducer处理了。hdfs输出文件如下:
如果再次分桶插入数据,那么又会产生四个新文件:
《2》load data方式插入数据是不会分桶的,因为根本不会转为mapreduce程序处理。。
3、分桶表的作用:
方便数据抽样:select * from teacher tablesample(bucket 1 out 3 on name);
注:分桶语法----TABLESAMPLE(BUCKET x OUT OF y)
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。 例如:table总共分了3份,当y=3时,抽取(3/3)=1个bucket的数据,当y=6时,抽取(3/6)=1/2个bucket的数据。
x表示从哪个bucket开始抽取。
例如:table总bucket数为3,tablesample(bucket 3 out of 3),表示总共抽取(3/3=)1个bucket的数据,抽取第3个bucket的数据。再例如:table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。
查询第一个桶里数据,并返回一半数据:
select * from teacher tablesample(bucket 1 out of 6 on name);
二、分桶且桶内排序(clustered by+sorted by)
sorted by是需要与clustered by一起用的,不能单独用
1、建表
create table test_bucket_sorted (
id int comment 'ID',
name string comment '名字'
)
comment '测试分桶'
clustered by(id) sorted by (id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
2、insert数据
insert数据到该表中所转为的mapreduce程序为:
将会启动与分桶数的相同的reducer任务。 按id进行partition分区,不同数据根据partition分区给不同reducer处理。
然后,同一个reducer处理的数据都会按照sorted by 指定的字段进行排序。
从这里就能够知道,分桶表与分桶排序其实就是在insert数据到该表时,读取到该表设置了分桶与分桶排序,那么就会根据建表的分桶信息设置一个partitioner,然后根据建表的sorted by字段设置reducer阶段的WritableComparator,用于reducer段数据的排序。。
更详细的原来请看:https://www.jianshu.com/p/922e2e37ae22
三、分区表
1、建表语句:
create table dept_partition(deptno int, dname string, loc string)
partitioned by (month string)
row format delimited fields terminated by '\t';
2、插入和导入语句
(1)静态分区
insert overwrite table dept_partition partition(month='2015-01-19') select * from test;
load data local inpath '/root/hive/partitions/file1' into table dept_partition
partition (month='2015-01-19');
都是在后面指定要插入或者导入的分区就行。。。"2015-01-19"这个分区是一个文件夹,而文件夹的名字就是2015-01-19。
(2)动态分区
在insert ...select时,使用select 查询出的字段列表中的最后的字段作为分区的key(如果分区字段只有一个,那么就是使用select列表中的最后一个字段,如果分区字段有多个,那么就使用select列表的最后n个字段作为分区key),该字段值相同的数据会放到同一个分区。
#启动动态分区功能
set hive.exec.dynamic.partition=true;
#允许全部分区都是动态分区
set hive.exec.dynamic.partition.mode=nostrick;
#month_id为静态分区,day_id为动态分区:
insert overwrite table dynamic_test partition(month_id='201710',day_id)
select c1,c2,c3,c4,c5,c6,c7,day_id from kafka_offset
where substr(day_id,1,6)='201710';# month_id和 day_id均为动态分区:
insert overwrite table dynamic_test partition(month_id,day_id)
select c1,c2,c3,c4,c5,c6,c7,substr(day_id,1,6) as month_id,day_id from kafka_offset;
为了让分区列的值相同的数据尽量在同一个mapreduce中,这样每一个mapreduce可以尽量少的产生新的文件夹,可以借助distribute by的功能,将分区列值相同的数据放到一起。
insert overwrite table dynamic_test partition(month_id,day_id)
select c1,c2,c3,c4,c5,c6,c7,substr(day_id,1,6) as month_id,day_id from kafka_offset
distribute by month_id,day_id;
参考:https://blog.csdn.net/afafawfaf/article/details/80249974
2、原理:
不论insert还是load data,其实都是把数据全部放到该表的目录下的与分区名同名的目录下。。
这样的好处就是:
查询的时候把分区当做一个字段使用,在where条件中指定month='2015-01-19',那么hive在查询数据只就只扫描该分区文件夹下面的数据,其他分区的数据就忽略了。可以提升效率。
四、分区分桶一起用
一起用时,在insert时就要指定分区(或者冬天分区),然后按照分桶规则,在每个分区目录下进行分桶。
hive 建表,分桶表(clustered by)、分桶且桶内排序(clustered by+sorted by)、分区表(partitioned by)、分区分桶一起用相关推荐
- Hive分桶表创建clustered by()
创建分桶表 -- 1 创建分桶表 create table t_us_covid19_bucket(count_date string,county string,state string,fips ...
- Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)
建表 基本语句格式 CREATE [external] TABLE if not exists student #默认建立内部表,加上external则是建立外部表(id int COMMENT'学号 ...
- hive 修改分桶数 分桶表_疯狂Hive之DDL操作二(三)
分区表创建 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition分区概念 分区表指的是在创建表的时 ...
- hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25
1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...
- Hive:命令行界面、数据类型、DDL数据定义(数据库及表操作/分区分桶)、DML数据操作(数据导入导出)
目录 1.Hive命令行界面 1.1.选项列表 1.2.变量和属性 1.2.1.Hive中变量和属性命名空间 1.2.2.用户自定义变量 1.2.3..hiverc文件 1.3.一次使用的命令 1.4 ...
- hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表
Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...
- hive详细笔记(四)-Hive内部表,外部表,分区表,分桶表详解(附带讲解视频)
本节目录 内部表和外部表 静态分区表 动态分区表 分桶表 抽样查询 1 内部表和外部表 未被external修饰的是内部表(managed table),被external修饰的为外部表(extern ...
- 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...
- Hive 分桶表原理及优化大表 join 实战
一.什么是分桶表 分桶表,比普通表或者分区表有着更为细粒度的数据划分. 举个例子,每天产生的日志可以建立分区表,每个分区在 hdfs 上就是一个目录,这个目录下包含了当天的所有日志记录. 而分桶表,可 ...
最新文章
- 拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
- LibreOffice去重复数据
- 1004 C语言设置测试数据个数和测试结束标志
- 全国计算机等级考试在线报名,全国计算机等级考试网上报考具体流程
- linux .net环境变量,Linux编程 系统环境变量位置, 环境变量持久化
- 基于html的火柴人羽毛球网页游戏设计
- React:栈调和(Reconciliation)
- 数据结构 与游戏背包的设计
- Idea设置全白色 背景
- Scroller全认知,对于Scroller 你真的了解吗?
- 最新版养猫小程序前端+后端搭建详细教程
- csv是什么文件(ofd是什么文件)
- Text-CNN 文本分类
- 操作系统——存储器管理
- 信息学奥赛一本通1278:复制书稿(evd)
- 思维导图绘制就是这样简单,手把手教你绘制一幅思维导图
- 品牌LOGO设计丨商业实践设计思路大揭秘 难怪他接单不断
- 蚂蚁金服的to B开放
- caj 服务器正在运行中,中国知网-帮助中心
- 反编译软件luyten
热门文章
- 太干了!大俠『云飞杨』带你走进GFX!
- 远离内卷,互联网的尽头是外企?
- openshift php.ini,openshift环境变量
- DOSBox下玩DOS经典GameZ或ZED游戏
- YTU 2895: H--唱歌的鸟儿
- [C++]打包传输结构体或大内存块的四种办法(完全版)
- 笔记本突然发出很大嗡嗡声_为游戏打造嗡嗡声
- 学校开展计算机培训活动,市计算机学校:培训大会促成长
- 正则表达式是如何让你的网页卡住的(优化100ms到2ms)
- windows 快速删除文件和文件夹