一、分桶表

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)、分区分桶一起用相关推荐

  1. Hive分桶表创建clustered by()

    创建分桶表 -- 1 创建分桶表 create table t_us_covid19_bucket(count_date string,county string,state string,fips ...

  2. Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)

    建表 基本语句格式 CREATE [external] TABLE if not exists student #默认建立内部表,加上external则是建立外部表(id int COMMENT'学号 ...

  3. hive 修改分桶数 分桶表_疯狂Hive之DDL操作二(三)

    分区表创建 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition分区概念 分区表指的是在创建表的时 ...

  4. hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25

    1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...

  5. Hive:命令行界面、数据类型、DDL数据定义(数据库及表操作/分区分桶)、DML数据操作(数据导入导出)

    目录 1.Hive命令行界面 1.1.选项列表 1.2.变量和属性 1.2.1.Hive中变量和属性命名空间 1.2.2.用户自定义变量 1.2.3..hiverc文件 1.3.一次使用的命令 1.4 ...

  6. hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表

    Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...

  7. hive详细笔记(四)-Hive内部表,外部表,分区表,分桶表详解(附带讲解视频)

    本节目录 内部表和外部表 静态分区表 动态分区表 分桶表 抽样查询 1 内部表和外部表 未被external修饰的是内部表(managed table),被external修饰的为外部表(extern ...

  8. 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别

    蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...

  9. Hive 分桶表原理及优化大表 join 实战

    一.什么是分桶表 分桶表,比普通表或者分区表有着更为细粒度的数据划分. 举个例子,每天产生的日志可以建立分区表,每个分区在 hdfs 上就是一个目录,这个目录下包含了当天的所有日志记录. 而分桶表,可 ...

最新文章

  1. 拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
  2. LibreOffice去重复数据
  3. 1004 C语言设置测试数据个数和测试结束标志
  4. 全国计算机等级考试在线报名,全国计算机等级考试网上报考具体流程
  5. linux .net环境变量,Linux编程 系统环境变量位置, 环境变量持久化
  6. 基于html的火柴人羽毛球网页游戏设计
  7. React:栈调和(Reconciliation)
  8. 数据结构 与游戏背包的设计
  9. Idea设置全白色 背景
  10. Scroller全认知,对于Scroller 你真的了解吗?
  11. 最新版养猫小程序前端+后端搭建详细教程
  12. csv是什么文件(ofd是什么文件)
  13. Text-CNN 文本分类
  14. 操作系统——存储器管理
  15. 信息学奥赛一本通1278:复制书稿(evd)
  16. 思维导图绘制就是这样简单,手把手教你绘制一幅思维导图
  17. 品牌LOGO设计丨商业实践设计思路大揭秘 难怪他接单不断
  18. 蚂蚁金服的to B开放
  19. caj 服务器正在运行中,中国知网-帮助中心
  20. 反编译软件luyten

热门文章

  1. 太干了!大俠『云飞杨』带你走进GFX!
  2. 远离内卷,互联网的尽头是外企?
  3. openshift php.ini,openshift环境变量
  4. DOSBox下玩DOS经典GameZ或ZED游戏
  5. YTU 2895: H--唱歌的鸟儿
  6. [C++]打包传输结构体或大内存块的四种办法(完全版)
  7. 笔记本突然发出很大嗡嗡声_为游戏打造嗡嗡声
  8. 学校开展计算机培训活动,市计算机学校:培训大会促成长
  9. 正则表达式是如何让你的网页卡住的(优化100ms到2ms)
  10. windows 快速删除文件和文件夹