Hive的分区和分桶

2023-09-20 15:53:33

目录

​编辑

一、Hive分区

1.1 分区产生的背景

1.2 动态分区

1.2.1 hive的动态分区介绍

1.2.2 动态分区配置

1.2.2.1 动态分区开启

1.2.2.2 动态分区模式

1.2.2.3 一个mr节点上,设置动态分区的最大数量

1.2.2.4 所有mr节点上,设置所有动态分区的最大数量

1.2.2.5 设置所有mr job 允许创建的文件的最大数量

1.2.3 动态分区实操

1.2.3.1 动态分区语法

1.2.3.2 实践案例

1.3 静态分区

1.3.1 静态分区介绍

1.3.2 静态分区实操

1.3.2.1 静态分区语法

1.3.2.2 单分区

1.3.2.3 多分区

1.3.2.4 修复分区

1.3.2.4.1 在hdfs创建目录并上传文件

1.3.2.4.2 创建外部表

1.3.2.4.3 查询结果(没有数据)

1.3.2.4.4 修复分区

1.3.2.4.5 查询结果(有数据)

1.4 多重分区

1.4.1 多重分区介绍

1.4.2 多重分区实操

1.4.2.1 多重分区语法

1.4.2.2 实践案例

1.5 静态分区和动态分区的区别

1.6 分区表的注意事项

二、Hive分桶

2.1 分桶的介绍

2.1.1 创建分桶表

2.1.2 分桶表导入数据的方式

2.1.2.1 load方式

2.1.2.2 insert 方式

2.1.3 分桶抽样查询

2.1.4 分区表和分桶表的结合使用

2.1.4.1 创建分区、分桶表

2.1.4.2 插入数据

2.1.4.3 查询数据


一、Hive分区

1.1 分区产生的背景

随着系统运行时间的增加,表的数据量会越来越大,而Hive查询数据的数据的时候通常使用的是「全表扫描」,这样将会导致大量不必要的数据进行扫描,从而查询效率会大大的降低。 从而Hive引进了分区技术,使用分区技术,「避免Hive全表扫描,提升查询效率」

1.2 动态分区

1.2.1 hive的动态分区介绍

hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在使用的时候会导致数据只能插入到某一个指定分区,无法让数据散列分布,因此更好的方式是当数据在进行插入的时候,根据数据的某一个字段或某几个字段值动态的将数据插入到不同的目录中,此时,引入动态分区。

1.2.2 动态分区配置

1.2.2.1 动态分区开启
set hive.exec.dynamic.partition=true;

默认值是true;

1.2.2.2 动态分区模式
set hive.exec.dynamic.partition.mode=nostrict;

默认:strict(至少有一个分区列是静态分区)

1.2.2.3 一个mr节点上,设置动态分区的最大数量

每一个执行mr节点上,允许创建的动态分区的最大数量

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

默认值是100。

1.2.2.4 所有mr节点上,设置所有动态分区的最大数量

所有执行mr节点上,允许创建的所有动态分区的最大数量

set hive.exec.max.dynamic.partitions;

默认值是1000。

1.2.2.5 设置所有mr job 允许创建的文件的最大数量

所有的mr job允许创建的文件的最大数量

set hive.exec.max.created.files;

默认值是100000。

1.2.3 动态分区实操

1.2.3.1 动态分区语法

分区的字段值是基于查询结果自动推断出来的。核心语法就是insert+select。

1.2.3.2 实践案例

1.3 静态分区

1.3.1 静态分区介绍

在涉及分区的DML/DDL中,这些分区列的值在编译时已知(由用户在创建表时给出)。静态分区分为单分区、多分区。

1.3.2 静态分区实操

1.3.2.1 静态分区语法
#分区关键字partitioned by(gender string........)
create table test_table
	(
	xxxx
	)
	partitioned by(gender string)
	row format delimited;
1.3.2.2 单分区
create table psn5
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';
1.3.2.3 多分区
create table psn6
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string,age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';

提示:多分区和单分区的差别在于分区字段的数量,单分区只有一个分区字段,多分区有多个分区字段

1.3.2.4 修复分区

在使用hive外部表的时候,可以先将数据上传到hdfs的某一个目录中,然后再创建外部表建立映射关系,如果在上传数据的时候,参考分区表的形式也创建了多级目录,那么此时创建完表之后,是查询不到数据的,原因是分区的元数据没有保存在mysql中,因此需要修复分区,将元数据同步更新到mysql中,此时才可以查询到元数据.

我们来验证一下。

1.3.2.4.1 在hdfs创建目录并上传文件
hdfs dfs -mkdir /ning
hdfs dfs -mkdir /ning/age=10
hdfs dfs -mkdir /ning/age=20
hdfs dfs -put /root/data/data /ning/age=10
hdfs dfs -put /root/data/data /ning/age=20
1.3.2.4.2 创建外部表
create external table psn11
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
	location '/ning';

1.3.2.4.3 查询结果(没有数据)
select * from psn11;

1.3.2.4.4 修复分区
msck repair table psn11;
1.3.2.4.5 查询结果(有数据)

select * from psn11;

1.4 多重分区

1.4.1 多重分区介绍

通过建表语句中关于分区的相关语法可以发现,Hive支持多个分区字段:PARTITIONED BY (partition1 data_type, partition2 data_type,….)。

多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。从HDFS的角度来看就是文件夹下继续划分子文件夹。

提示:其实和上一节说的静态分区中的多分区是一个东西,只是把它单独拎出来做了说明。

1.4.2 多重分区实操

1.4.2.1 多重分区语法

PARTITIONED BY (partition1 data_type, partition2 data_type,….)。

1.4.2.2 实践案例
create table psn6
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string,age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';

查询:

select * from psn6 where gender='男' and age=10;

1.5 静态分区和动态分区的区别

1)加载数据的方式:静态分区可以通过load命令,向不同的分区加载数据,加载数据时要指定分区的值;静态分区只能通过select加载数据,并且不需要指定分区的名字,而是根据伪列的值,动态的确定分区值
2)确定分区值的方式:两者在创建表的时候命令完全一致,只是在确定分区值的时候不同,静态分区需要手动指定分区值,而动态分区会自动识别伪列的属性,动态生成分区值

1.6 分区表的注意事项

1)分区表不是建表的必要语法规则,是一种优化手段表,可选;

2)分区字段不能是表中已有的字段,不能重复;

3)分区字段是虚拟字段,其数据并不存储在底层的文件中;

4)分区字段值的确定来自于用户价值数据手动指定(静态分区)或者根据查询结果位置自动推断(动态分区)

5)Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度

二、Hive分桶

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

分区提供了一个隔离数据和优化查询的可行方案,但是并非所有的数据集都可以形成合理的分区,分区的数量也不是越多越好,过多的分区条件可能会导致很多分区上没有数据。同时 Hive 会限制动态分区可以创建的最大分区数,用来避免过多分区文件对文件系统产生负担。鉴于以上原因,Hive 还提供了一种更加细粒度的数据拆分方案:分桶表 (bucket Table)。
分桶表会将指定列的值进行哈希散列,并对 bucket(桶数量)取余,然后存储到对应的 bucket(桶)中。

2.1 分桶的介绍

2.1.1 创建分桶表

create external table psn17
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
    clustered by(id) 
    into 4 buckets
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
    location '/data/buckt/';

2.1.2 分桶表导入数据的方式

2.1.2.1 load方式
load data local inpath 'opt/module/datas/stu.txt' into table psn17;

查询分桶表数据:

select * from psn17;

2.1.2.2 insert 方式
insert into table psn18 select * from psn17; 

2.1.3 分桶抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive 可以通过对表进行抽样来满足这个需求。 语法: TABLESAMPLE(BUCKET x OUT OF y) 查询分桶表中的数据。

select * from psn18 tablesample(bucket 1 out of 4 on id);

x表示从哪个bucket开始抽取。 例如,table总bucket数为4,bucket 4 out of 4,表示总共抽取(4/4=)1个bucket的数据, 抽取第4个bucket的数据。

hive根据y的大小,决定抽样的比例。 例如,table总共分了4份(4个bucket), 当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。

注意:x 的值必须小于等于 y 的值,否则

Error: Error while compiling statement: FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table psn18 (state=42000,code=10061)

2.1.4 分区表和分桶表的结合使用

分区表和分桶表的本质都是将数据按照不同粒度进行拆分,从而使得在查询时候不必扫描全表,只需要扫描对应的分区或分桶,从而提升查询效率。两者可以结合起来使用,从而保证表数据在不同粒度上都能得到合理的拆分。

2.1.4.1 创建分区、分桶表
create external table psn19
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
        partitioned by(age int)
        clustered by(id) 
        into 4 buckets
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
        location '/data/buckt_parttion/';

2.1.4.2 插入数据
INSERT into psn19 partition(age=10) select * from psn18 limit 4;

2.1.4.3 查询数据
select * from psn19 tablesample(bucket 1 out of 4 on id) where age=10;

好了,今天Hive分区于分桶的相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

更多推荐

系统架构设计师(第二版)学习笔记----信息安全基础知识

【原文链接】系统架构设计师(第二版)学习笔记----信息系统基础文章目录一、信息安全的概念1.1信息安全的基本要素1.2信息安全的内容1.3设备安全的内容1.4数据安全的内容1.5内容安全的含义1.6行为安全的含义二、信息存储安全2.1信息存储安全的内容有:2.2信息使用安全的内容2.3用户的标识与验证方法2.4用户存

【Docker】Docker安全性与安全实践(五)

前言:Docker安全性的作用和意义在于确保容器化应用程序和镜像的隔离性、保护数据和系统资源、防止恶意攻击,以及提高应用的整体安全性。文章目录1.Docker安全性1.1`隔离性`1.2`镜像安全`1.3`特权访问`1.4`数据保护`2.Docker安全实践2.1`使用官方镜像或可信源`2.2`更新和修补镜像`2.3`

【Rust 基础篇】Rust中的不安全函数:解锁系统级编程的黑盒之门

导言Rust是一种以安全性和高效性著称的系统级编程语言。它的设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"借用检查器"和"所有权系统"等特性,有效地避免了空指针、数据竞争等常见的安全问题。然而,有些场景下,为了完成某些高级操作或者与底层交互,Rust需要突破其安全边界。

工业交换机为什么有必要进行老化测试?

我们可以根据客户的要求来制定老化测试的检测标准,如果没有特别的要求,我们将依照国家相应的标准进行老化测试检验。老化测试的主要目的是通过模拟产品在现实使用过程中所面临的各种恶劣条件,对产品进行高强度的测试。同时,根据产品的使用要求,合理预测其使用寿命。老化测试是为了确保产品达到满意的合格率,几乎所有产品在出厂前都必须经过

Golang使用Channel

1.使用协程packagemain//使用协程import("fmt""strconv""time")functest(){fori:=1;i<=10;i++{fmt.Println("test()helloworld"+strconv.Itoa(i))time.Sleep(time.Second)}}//主线程和te

开源与区块链:去中心化的未来

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

ddns有什么作用?无公网IP怎么将内网IP端口映射外网访问

DDNS是什么?DDNS英文全称DynamicDomainNameServer,中文含义是指动态域名服务。很多普通路由器或者智能路由器设置中,都可以找到DDNS(动态DNS)功能。上面的解释可能过于专业,其实DDNS通俗点说,它是一种将用户的动态IP地址映射到一个固定的域名解析服务上的功能,因为现在目前大多数路由器拨号

如何将内网ip映射到外网?快解析内网穿透

关于内网ip映射到外网的问题,就是网络地址转换,私网借公网。要实现这个,看起来说得不错,实际上是有前提条件的。要实现内网ip映射到外网,首先要有一个固定的公网IP,可以从运营商那里得到。当你得到公网IP后,你的私网有可能有多台主机,都要挂到公网上,这时候会用到DMZ。比如,你有一个公网IP,也可能是通过快解析等得到,你

R语言绘制PCA双标图、碎石图、变量载荷图和变量贡献图

1、原论文数据双标图代码:setwd("D:/Desktop/0000/R")#更改路径#导入数据df<-read.table("Inputdata.csv",header=T,sep=",")#-----------------------------------#所需的包:packages<-c("ggplot2"

网络监控应用程序

在过去的几十年中,网络监控应用稳步发展,以适应不断变化的市场需求和期望。多年来,停机成本飙升,客户对停机的耐心比以往任何时候都低,不仅仅是正常运行时间,正常运行时间的质量也变得很重要。另一个发展是网络的复杂性日益增加。现代网络监控应用程序必须优化云原生、基于云的和整合环境的性能。对现代网络监控软件的期望网络监控工具有望

数据结构和算法(7):图应用

双连通分量:判定准则考查无向图G。若删除顶点v后G所包含的连通域增多,则v称作切割节点或关节点。不含任何关节点的图称作双连通图。任一无向图都可视作由若干个极大的双连通子图组合而成,这样的每一子图都称作原图的一个双连通域。如何才能找出图中的关节点呢?1.蛮力算法首先,通过BFS或DFS搜索统计出图G所含连通域的数目;然后

热文推荐