Hive ---- 分区表和分桶表

news/2024/11/15 6:47:46/

Hive ---- 分区表和分桶表

  • 1. 分区表
    • 1. 分区表基本语法
    • 2. 二级分区表
    • 3. 动态分区
  • 2. 分桶表
    • 1. 分桶表基本语法
    • 2. 分桶排序表

1. 分区表

Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。

1. 分区表基本语法

1. 创建分区表

create table dept_partition
(deptno int,    --部门编号dname  string, --部门名称loc    string  --部门位置
)partitioned by (day string)row format delimited fields terminated by '\t';

2. 分区表读写数据

1)写数据

(1)load

数据准备

在/opt/module/hive/datas/路径上创建文件dept_20220401.log,并输入如下内容。

10	行政部	1700
20	财务部	1800

装载语句

load data local inpath '/opt/module/hive/datas/dept_20220401.log'
into table dept_partition
partition(day='20220401');

(2)insert

将day='20220401’分区的数据插入到day='20220402’分区,可执行如下装载语句

insert overwrite table dept_partition partition (day = '20220402')
select deptno, dname, loc
from dept_partition
where day = '20220401';

在这里插入图片描述

2)读数据

查询分区表数据时,可以将分区字段看作表的伪列,可像使用其他字段一样使用分区字段。

select deptno, dname, loc ,day
from dept_partition
where day = '20220401';

在这里插入图片描述

3. 分区表基本操作

1)查看所有分区信息

show partitions dept_partition;

在这里插入图片描述

2)增加分区

(1)创建单个分区

alter table dept_partition
add partition(day='20220403');

(2)同时创建多个分区(分区之间不能有逗号)

alter table dept_partition
add partition(day='20220404') partition(day='20220405');

3)删除分区

(1)删除单个分区

alter table dept_partition
drop partition (day='20220403');

(2)同时删除多个分区(分区之间必须有逗号)

alter table dept_partition 
drop partition (day='20220404'), partition(day='20220405');

4)修复分区

Hive将分区表的所有分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才能正常读写数据。若用户手动创建/删除分区路径,Hive都是感知不到的,这样就会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表为外部表,用户执行drop partition命令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。

若出现元数据和HDFS路径不一致的情况,可通过如下几种手段进行修复。

(1)add partition

若手动创建HDFS的分区路径,Hive无法识别,可通过add partition命令增加分区元数据信息,从而使元数据和分区路径保持一致。

(2)drop partition

若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition命令删除分区元数据信息,从而使元数据和分区路径保持一致。

(3)msck

若分区元数据和HDFS的分区路径不一致,还可使用msck命令进行修复,以下是该命令的用法说明。

msck repair table table_name [add/drop/sync partitions];

说明:
msck repair table table_name add partitions:该命令会增加HDFS路径存在但元数据缺失的分区信息。

msck repair table table_name drop partitions:该命令会删除HDFS路径已经删除但元数据仍然存在的分区信息。

msck repair table table_name sync partitions:该命令会同步HDFS路径和元数据分区信息,相当于同时执行上述的两个命令。

msck repair table table_name:等价于msck repair table table_name add partitions命令。

2. 二级分区表

思考:如果一天内的日志数据量也很大,如何再将数据拆分?答案是二级分区表,例如可以在按天分区的基础上,再对每天的数据按小时进行分区。

1)二级分区表建表语句

create table dept_partition2(deptno int,    -- 部门编号dname string, -- 部门名称loc string     -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';

2)数据装载语句

load data local inpath '/opt/module/hive/datas/dept_20220401.log'
into table dept_partition2
partition(day='20220401', hour='12');

在这里插入图片描述

3)查询分区数据

select*
from dept_partition2
where day='20220401' and hour='12';

在这里插入图片描述

3. 动态分区

动态分区是指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态的决定。使用动态分区,可只用一个insert语句将数据写入多个分区。

1)动态分区相关参数

(1)动态分区功能总开关(默认true,开启)

set hive.exec.dynamic.partition=true;

(2)严格模式和非严格模式

动态分区的模式,默认strict(严格模式),要求必须指定至少一个分区为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。

set hive.exec.dynamic.partition.mode=nonstrict;

(3)一条insert语句可同时创建的最大的分区个数,默认为1000。

set hive.exec.max.dynamic.partitions=1000;

(4)单个Mapper或者Reducer可同时创建的最大的分区个数,默认为100。

set hive.exec.max.dynamic.partitions.pernode=100;

(5)一条insert语句可以创建的最大的文件个数,默认100000。

set hive.exec.max.created.files=100000;

(6)当查询结果为空时且进行动态分区时,是否抛出异常,默认false。

set hive.error.on.empty.partition=false;

2)案例实操

需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition_dynamic的相应分区中。

(1)创建目标分区表

create table dept_partition_dynamic(id int,name string
)
partitioned by (loc int)
row format delimited fields terminated by '\t';

(2)设置动态分区

insert into table dept_partition_dynamic
partition(loc)
selectdeptno,dname,loc
from dept;

(3)查看目标分区表的分区情况

show partitions dept_partition_dynamic;

在这里插入图片描述

2. 分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。

分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。

1. 分桶表基本语法

1)建表语句

create table stu_buck(id int,name string
)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';

2)数据装载

(1)数据准备

在/opt/module/hive/datas/路径上创建student.txt文件,并输入如下内容。

1001	student1
1002	student2
1003	student3
1004	student4
1005	student5
1006	student6
1007	student7
1008	student8
1009	student9
1010	student10
1011	student11
1012	student12
1013	student13
1014	student14
1015	student15
1016	student16

(2)导入数据到分桶表中

说明:Hive新版本load数据可以直接跑MapReduce,老版的Hive需要将数据传到一张表里,再通过查询的方式导入到分桶表里面。

load data local inpath '/opt/module/hive/datas/student.txt'
into table stu_buck;

(3)查看创建的分桶表中是否分成4个桶

在这里插入图片描述

(4)观察每个分桶中的数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 分桶排序表

1)建表语句

create table stu_buck_sort(id int,name string
)
clustered by(id) sorted by(id)
into 4 buckets
row format delimited fields terminated by '\t';

2)数据装载

(1)导入数据到分桶表中

load data local inpath '/opt/module/hive/datas/student.txt'
into table stu_buck_sort;

(2)查看创建的分桶表中是否分成4个桶

load data local inpath '/opt/module/hive/datas/student.txt'
into table stu_buck_sort;

在这里插入图片描述

(3)观察每个分桶中的数据

很明显,分桶的数据都按照 id 进行了排序

在这里插入图片描述


http://www.ppmy.cn/news/101104.html

相关文章

Studio One6简体中文版全新版本功能详解

Studio One 6是一款强大的音乐编曲软件,可以帮助您使用灵活的和弦轨道功能实现音乐创作。通过新的智能模板、直观的拖放工作流、可定制的用户界面和强大的集成工具,使创建快速而轻松。 无论你选择 Studio One 哪个版本,你都可以得到无限的音轨、通道和插…

JetBrains的多数据库管理和SQL工具DataGrip 2023版本在Linux系统的下载与安装配置教程

目录 前言一、DataGrip安装二、使用配置总结 前言 DataGrip是一款多数据库管理和SQL工具,适用于不同类型的数据库。它提供了丰富的功能和工具,可以帮助开发人员更高效地管理数据库、编写SQL查询和执行数据操作。注:已在CentOS7.9和Ubuntu20.…

WalkRE--地籍处理

前提:在套图的基础之上,可进行下一步地籍的操作。(套好图,并检查处理至无错误状态后) 1、地籍--宗地基本信息填写。 地籍处理部分,需按上图依次向下进行属性信息的填写。填写完属性信息后,需进…

微信的大动作,很多人要颤抖了

4月25日,微信团队发布关于微信公众号营销内容合规规范通知,要求公众号在投放商业广告时需要标注广告字样。 刚开始觉得也没啥,无非就是加个广告的字样,让消费者可以及时识别出来, 但从效果来看,似乎效果并不…

内存泄露的循环引用问题

内存泄漏一直是很多大型系统故障的根源,也是一个面试热点。那么在编程语言层面已经提供了内存回收机制,为什么还会产生内存泄漏呢? 这是因为应用的内存管理一直处于一个和应用程序执行并发的状态,如果应用程序申请内存的速度&…

java设计模式之策略设计模式的前世今生

策略设计模式是什么? 策略设计模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。策略模式使得算法独立于使用它的客户而独立变化,客户可以根据需要选…

独孤思维:蠢货,你又被这种钱蛊惑了

昨天久未联系的朋友找我,一上来就说自己加入了xx项目,被骗了钱,问我怎么办? 这个世界每天都在上演被敲诈、被勒索、被欺骗的戏码。 总是觉得别人是蠢货,这种事绝对不会发生在自己身上。 结果呢,稍不留心…

idea注释模板开发配置

idea注释模板开发配置 Class⽂件头部注释配置⽅法注释配置 Class⽂件头部注释配置 打开IDEA配置窗⼝ 选择 Editor -> File and Code Templates 在选项卡中的 include 的 File Header 中输⼊以下内容: /** * * author 作者名称(按照自己名称进行定义) * date ${YEAR}-${MO…