Hive的分区和分桶

news2024/9/29 8:39:45

目录

​编辑

一、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分区于分桶的相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装redis超级详细教程

redis源码安装 安装gcc redis是C语言编写的&#xff0c;所以我们需要先在Linux上安装和升级&#xff0c;C语言的编译环境。 #安装gcc yum install -y gcc-c autoconf automake#centos7 默认的 gcc 默认是4.8.5,版本小于 5.3 无法编译,需要先安装gcc新版才能编译 gcc -v#升级…

rv1126-rv1109-环境搭建-全部编译的方法

主要参考:Rockchip_Developer_Guide_Linux_Software_CN.pdf / SDK-Rockchip_RV1126_RV1109_Quick_Start_Linux_CN.pdf 找对文档事半功倍!为什么这么说,因为没找对绕了路!别笑! //解压源码,基础略过 tar xvf rv1126_rv1109_linux_v3.0.2_20230724.tgz -C rv1126_rv1109 cd rv1…

【Axure高保真原型】动态控制不透明度

今天和大家分享动态控制不透明度的原型模板&#xff0c;我们可以滑块左右拖动或者点击滑条的某个位置&#xff0c;从而控制图片上方遮罩的不透明度……具体效果可以打开下方原型地址体验或者点击下方视频观看 【原型效果】 【Axure高保真原型】动态控制不透明度 【原型预览及下…

No thread-bound request found 错误以及解决方案

异常信息&#xff1a; cause: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually o…

一起学数据结构(7)——树及二叉树的基本概念及存储

前面的关于数据结构的文章中&#xff0c;介绍了顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列等数据结构。对于以上数据结构&#xff0c;均是一对一的关系。本篇文章将对于一对多的数据结构——树进行解析。 目录 1. 树的定义及基本概念&#xff1a; 1.1 树的定义&a…

结合el-tooltip,实现内容过长省略,移上显示全部

在系统中&#xff0c;内容过长需要省略&#xff0c;鼠标移上显示全部&#xff0c;这个是常用的功能&#xff0c;也有很多方案解决这种。 单行内容超出处理 常用的css方案&#xff1a; .ellipsis {overflow: hidden;white-space: nowrap;text-overflow: ellipsis; } 该样式在…

基于Android系统英语学习助手APP设计开发

一、 设计思路 1.1设计目标 1.2设计思路 1.3设计内容 1.3.1界面设计 1.3.2功能模块设计 1.3.3功能流程图 1.3.4数据库设计&#xff08;如果没有数据库这部分删除&#xff09; 1.4工具设备要求 1.5技术方案 二、设计过程与说明 2.1技术路线 2.2实现方案 2.3实现原理…

C#复习:面向对象基本概念

C#复习&#xff1a;面向对象基本概念 前言什么是面向对象类&#xff0c;名称空间的介绍 如何导入类库DLL引用(黑盒引用)项目引用(白盒引用)NuGet介绍 依赖关系C#的分装(个人理解) 前言 关于我C#的博客是根据刘铁猛老师的C#入门课程为基础写的&#xff0c;可以配合刘铁猛老师的…

.bat批处理命令处理文件

批处理命令处理文件找到上级目录&#xff0c;并删除文件与文件夹 参考资料&#xff1a; [BAT] 如何获取bat的上一级目录、上两级目录..._bat 上层目录_Risun_Lee的博客-CSDN博客echo offset currPath%~dp0set parentPathset parentparentPath:beginfor /f "tokens1,* de…

solidworks导出文本能打开的stl文件

几种以文本格式&#xff08;ASCII&#xff09;导出stl的设置 1.solidworks导出时需要在选项里设置导出格式为ASCII&#xff0c;当选择以二进制格式导出时&#xff0c;打开会乱码&#xff1b; 2.CAD直接导出的是以二进制形式导出的&#xff0c;导出后也无法使用文本打开&#xf…

NVIDIA DALI学习:数据加载

DALI的工作流&#xff0c; 如下图&#xff1a; 读取数据图像解码和变换&#xff0c;可以放到GPU上进行&#xff0c;也是加速的关键生成处理好的数据&#xff0c; 导出给计算引擎 测试用例 import ctypesimport numpy as np import nvidia.dali.fn as fn import nvidia.dali…

关于Godot动态生成节点的细节

var dy_btn Button.new()add_child(dy_btn)print(get_child(0).name) 此时获取的名词会带有动态类型&#xff0c;如果这个时候想通过特定的节点名词来获取节点是不行的 此时需要补充类似 dy_btn.name "a" 的代码&#xff0c;然后就能按照节点名词获取节点了

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

软考软件设计师-计算机组成与体系结构(上

软考中级 一、数据的表示如果是其他进制 二、把十进制转其他进制【短除法三、存储系统的层次结构存储系统-存储器的分类 四、把二进制转8进制与16进制二进制转8进制二进制转16进制 五、原码、反码、补码原码反码补码移码原码 反码 补码的取值范围 六、数据的表示-浮点数运算七、…

TienChin 渠道管理-配置字典常量

在字典管理当中添加渠道状态 channel_status&#xff1a;渠道状态 分别为&#xff1a; 正常&#xff0c;键值为1&#xff0c;回显样式为 success 禁用&#xff0c;键值为0&#xff0c;回显样式为 info !> 有个注意点&#xff1a;Vue3 当中 v-for 与 v-if 不能写在一起。 在上…

Linux 查看进程和线程

ps命令 在ps命令中&#xff0c;“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。 ps -T -p <pid> “SID”栏表示线程ID&#xff0c;而“CMD”栏则显示了线程名称。 你可以用 ps -eLf |grep XXX 来查看程序运行所产生的线程情…

005:vue2使用vue-type-writer实现打字机效果

Vue Type Writer是一个Vue.js 2打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。 文章目录 1. 效果2. 安装使用 1. 效果 2. 安装使用 npm 安装 npm install vue-type-writer --save完整代码 <template><div class"app-container home"><…

MyBatis 高级使用

文章目录 动态SQL语句ifchoosetrimforeach 批量操作批量插入批量更新批量删除BatchExecutor 关联查询嵌套查询延迟加载 分页操作逻辑分页物理分页 MyBatis Generator添加配置文件添加插件生成 通用Mapper方式一方式二 MyBatis-Plus 动态SQL语句 动态 SQL 是 MyBatis 的强大特性…