hive的分区表和分桶表详解

分区表

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

静态分区表基本语法

创建分区表
create table dept_partition
(deptno int,    --部门编号dname  string, --部门名称loc    string  --部门位置
)partitioned by (day string)row format delimited fields terminated by '\t';
写数据:

创建文件写入以下数据并上传到HDFS上面:

10	行政部	1700
20	财务部	1800

在这里插入图片描述

load加载数据:
load data inpath 'hdfs://flinkv1:8020/input/dept_20220401.log'into table dept_partitionpartition(day='20220401');
insert加载数据

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

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

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

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

在这里插入图片描述

查看所有分区信息
 show partitions dept_partition;

在这里插入图片描述

增加分区

(1)创建单个分区

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

在这里插入图片描述

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

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

在这里插入图片描述

删除分区

(1)删除单个分区

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

在这里插入图片描述

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

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

在这里插入图片描述

修复分区

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];

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

msck repair table table_name add partitions

该命令会删除HDFS路径已经删除但元数据仍然存在的分区信息。

msck repair table table_name drop partitions

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

msck repair table table_name sync partitions

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

msck repair table table_name

二级分区表

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

二级分区表建表语句
create table dept_partition2(deptno int,    -- 部门编号dname string, -- 部门名称loc string     -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
数据装载语句
load data inpath 'hdfs://flinkv1:8020/input/dept_20220401.log'into table dept_partition2partition(day='20220401', hour='12');
查询分区数据
select * 
from dept_partition2 
where day='20220401' and hour='12';

在这里插入图片描述

动态分区

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

动态分区相关参数

(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。

hive.exec.max.created.files=100000

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

hive.error.on.empty.partition=false
案例实操

需求:将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)设置动态分区

set hive.exec.dynamic.partition.mode = nonstrict;
insert into table dept_partition_dynamic 
partition(loc) 
select deptno, dname, loc 
from dept;

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

show partitions dept_partition_dynamic;

在这里插入图片描述

分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。
分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。

分桶表基本语法

(1)建表语句

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

(2)数据装载
创建student.txt文件,并输入如下内容,上传HDFS

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 inpath 'hdfs://flinkv1:8020/input/student.txt'into table stu_buck;

(3)查看创建的分桶表中是否分成4个桶
在这里插入图片描述

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

分桶排序表

(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)数据装载

load data inpath 'hdfs://flinkv1:8020/input/student.txt'into table stu_buck_sort;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278115.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Date/Timestamp类型前端传空请求400

Timestamp类型字段前端传参空的 就请求400 集中解决方式: 1、直接页面干掉这几个字段不传 2、后端修改类型为String 3、前端请求前判断如果是空的就去掉 这边采用第三种解决的,在提交前去掉就行 // 移除空值字段 $(.showdiv input).each(function()…

1130 - Host “WIN-CA4FHERGO9J‘ is not allowed to connect to this MySQL server

1、知识小课堂 1.1 Mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。它是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS (Relational Database Management System&am…

Flink+Kafka消费

引入jar <dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.8.0</version> </dependency> <dependency><groupId>org.apache.flink</groupId><artifactI…

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest, ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…

万户 OA OfficeServer.jsp 任意文件上传漏洞复现

0x01 产品简介 万户OA是面向政府组织及企事业单位的FlexOffice自主安全协同办公平台。 0x02 漏洞概述 万户OA OfficeServer.jsp接口存在任意文件上传漏洞,攻击者可通过该漏洞上传任意文件从而控制整个服务器。 0x03 复现环境 FOFA: (banner="OASESSIONID" &a…

机器人与3D视觉 Robotics Toolbox Python 二 空间位姿描述

空间位姿描述 二维空间位姿描述 二维空间位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

数据持久化与临时存储的对决:localStorage 与 sessionStorage(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

设计模式——桥接模式(结构型)

引言 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#xff0c; 先考虑一个简单的…

将 Github token 添加至远程仓库

将 Github token 添加至远程仓库后便于每次 push 重复输入的麻烦 首先,将已生成的 token 记录(注:生成后的 token 确认后便无法查看只能重新生成)并找到对应的项目 git 本地文件路径下 其次,将其与项目所关联,按如下格式配置即可 token 格式类似于 ghp_CAxxxxxxxxxxxxxxxxxGx5j…

C++STL中string详解(零基础/小白,字符串)

目录 1. 基本概念&#xff1a; 1.1 本质&#xff1a; 1.2 string和char*区别&#xff1a; 1.3 特点&#xff1a; 2. 构造函数(初始化) 3. 赋值操作 4. 字符串拼接 5 查找 和 替换 6. 字符串比较 7. 字符存取 8. 插入和删除 9. 子串获取 1. 基本概念&#xff1a; 1.…

字节与位在物联网传输协议中的使用

1个字节(byte) 8个位(bit) 如下例子&#xff0c;是一个上报数据类型的表格&#xff0c;总有48位(6个字节) 假如报文给的数据类型数据是&#xff1a; 0x06 时&#xff0c;06十六进制转为二进制&#xff0c;结果是00000110 那么在图下就是 (bit1 和 bit2 都为 1) &#xff…