hive之存储优化

news2024/11/26 20:22:22

从这里开始就是hive调优阶段,怎么让hive跑的更快。

分区表和分桶表都是从存储方向进行优化。

目录

分区表:

概念:

代码:

load填充数据:

insert+select填充数据:

需求:

 分区表基本操作

(一)查看所有分区信息

(二)增加分区

(1)创建单个分区

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

(三)删除分区

(1)删除单个分区

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

(四)修复分区

(1)add partition

(2)drop partition

(3)msck

(五)二级分区

创建表:

数据载入;

(六)动态分区

1)动态分区相关参数

eg需求:

分桶表:

概念:

操作:

分桶排序表:


分区表:

概念:

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

代码:

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

上述代码创建了分区表,创建后的表是有4个字段以(day string)进行分区

load填充数据:

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

可以看到与原来的load语句有不一样的地方---后边多出来partition(day='20220401')

这个就是进行分区的字段  直接填充入该分区内(我们填充数据的源文件是没有这个字段的)

查询结果:可以看出是查询的四个字段的数据 

insert+select填充数据:

需求:

把分区为0401分区的数据复制一份到0402分区中

insert overwrite table dept_partition partition (day='20220402')
select
 deptno,
       dname,
       loc
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');

添加分区后不尽会在hive上创建相应路径,而且还会在元数据中体现(mysql)分区也是元数据的一种。

(三)删除分区

(1)删除单个分区

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

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

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

删除分区也是删除hdfs路径与元数据

分区表也是有内部表(管理表)与外部表之分的

外部分区表删除分区的时候也是只删除MySQL(元数据),不删除hdfs路径

(四)修复分区

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

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

(1)add partition

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

在hive创建对应分区:

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

(2)drop partition

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

同上操作

无论是删除还是补充都是以hdfs的路径为准

(3)msck

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

造成不一致的原因:

  1. 分区信息未正确更新:如果你在创建、删除或更改表的分区时没有正确更新Hive元数据或其他管理工具中的分区信息,就会导致分区元数据与HDFS中的实际分区路径不一致。

  2. 目录操作错误:如果你通过直接使用文件系统命令而不是使用Hive或其他管理工具来创建、删除或移动分区目录,就可能导致分区元数据和HDFS分区路径之间的不一致。

  3. 数据丢失或损坏:如果在HDFS上删除了某个分区的数据或数据发生了损坏,但分区元数据中仍然存在对该分区的引用,就会导致分区元数据和实际分区路径不匹配。

  4. 分区数据的外部更改:如果你在HDFS上手动更改了某个分区的数据目录结构或文件内容,而没有相应地更新分区元数据,就会导致分区元数据和HDFS分区路径之间的不一致。

代码:

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路径和元数据分区信息,相当于同时执行上述的两个命令。(会删除所有需要删除的分区信息   and   会增加所有需要增加的分区信息)

默认:

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

(五)二级分区

项目中绝大多数是按日期进行分区的(一天一个分区,每个分区只保存当天的数据)

二级分区就是在创建表的时候标注出两个分区字段

eg:我们每天是一个分区,在每个分区中按每个小时进行分区

创建表:

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

一级分区写在前面,二级分区写在后边

数据载入;

load:

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

(六)动态分区

  动态分区是指向分区表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。

hive.exec.max.created.files=100000

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

hive.error.on.empty.partition=false
eg需求:

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

查看表的分区情况:

show partitions dept_partition_dynamic;

分桶表:

概念:

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

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

操作:

声明分桶字段:

分区字段与分桶字段不能是相同的字段

分区字段不是普通的建表字段,而分桶字段是来自普通的建表字段,可参考上下文的建表语句

clustered by(id)

设置分桶数(用于取模运算):

into 4 buckets

建表:

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

使用load语句进行导入数据:

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

运行结果可知在hdfs路径下的文件夹下创建了4个文件(设置了4个桶)---这是因为在hive3进行了升级,在导入数据的时候可以直接执行mapreduce程序,而老版本则是不能直接问创建分区表,需要先创建普通的表导入数据后在通过insert--select语句进行分桶操作。

分桶排序表:

分桶排序表是对每个分桶中的数据进行排序,只需要在建表语句中的分桶字段的后边添加一个桶内排序字段,不要求两个字段一致,个数也不一定是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';

导入数据:

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

导入后便可通过hdfs的web端进行查看桶内数据情况。

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

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

相关文章

vue3自定义日历

原理 现在的日历分为两种开头: 1. 日, 一, 二, 三, 四, 五, 六 2. 一, 二, 三, 四, 五, 六, 日一行7个日期,一共6行 其实不管哪种都一样,首先要确定第一行1号在哪个位置。 如果说是 日, 一, 二, 三, 四, 五, 六,那么getDay()是几…

了解Unity编辑器之组件篇UI(一)

UI组件:提供了用户交互,信息展示,用户导航等功能 一、Button:用于响应用户的点击事件 1.Interactable(可交互):该属性控制按钮是否可以与用户交互,如果禁用则按钮无法被点击。可以通…

为什么TM服务器要安装php~

"想像力比知识更重要。因为知识是有限的,而想像力是无限,它包含了一切,推动着进步,是人类进化的源泉。 -- 爱因斯坦 为什么服务器要安装php~ 服务器为什么安装PHP (2023年) 导读:今天来给各位分享关于服务器为什么…

List有值二次转换给其他对象报null

List<PlatformUsersData> listData platformUsersMapper.selectPlatformUserDataById(data); users.setPlatformUsersData(listData);为什么listData 有值&#xff0c;users.getPlatformUsersData&#xff08;&#xff09;仍然为空在这段代码中&#xff0c;我们假设listD…

初识C++ ------ 引用、内联函数、auto关键字、基于范围的for循环、指针空值

文章目录 引用特点引用和指针的区别 内联函数概念 auto 关键字基于范围的for循环指针空值 nullptr &#xff08;C11&#xff09; 引用 特点 传引用返回&#xff1a;提高了效率&#xff0c;可以修改返回对象&#xff0c;传引用传参&#xff1a;提高效率&#xff0c;输出型参数。…

解密动态内存管理的奥秘(含内存4个函数)

目录 一.为什么存在动态内存管理 二.动态内存函数的介绍 1. malloc函数&#xff08;memory alloc 内存开辟&#xff09; 函数介绍&#xff1a; malloc函数使用举例代码&#xff1a; 2.free&#xff08;释放&#xff09; 函数介绍&#xff1a; 代码的示例&#xff1a…

Linux 网络通信epoll详解( 10 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

《网络是怎样连接的》(二.1)

(83条消息) 《网络是怎样连接的》&#xff08;一&#xff09;_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第二章。 目录 &#xff08;1&#xff09;创建套接字 &#xff08;2&#xff09;连接服务器 &#xff08;3&#xff09;收发数据 &#xf…

文本预处理——文本处理的基本方法

目录 什么是分词jieba分词特性精确模式分词全模式分词搜索引擎模式分词使用用户自定义词典 命名实体识别词性标注 什么是分词 jieba分词特性 精确模式分词 import jieba content工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 print(jieba.lcut(co…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 上节课我们说过了&#xff0c;有一些网站比较痛恨爬虫程序&#xff0c;它们不喜欢被程序所访问&#xff0c;所以它们会检查链接的来源&#xff0c;如果说来源不是正…

ONGUI

public class ONGUI : MonoBehaviour {private void OnGUI() {GUI.Label(new Rect(0,0,100,250),"ONGUI");} }说明是以左上角为原点来算的

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)

目录 服务网关Gateway_三大核心概念 服务网关Gateway_入门案例 服务网关Gateway_路由规则 服务网关Gateway_Java API构建路由 服务网关Gateway_动态路由 服务网关Gateway_断言功能详解 服务网关Gateway_三大核心概念 路由(Route) 这是网关的基本构建块。它由一个ID&am…

小程序自定义导航栏

效果图 代码 app.json文件下 "window":{"navigationStyle": "custom" //增加此属性},app.js文件 //计算高度 App({onLaunch() {wx.getSystemInfo({ // 获取设备信息success: (res) > {this.globalData.systeminfo res//导航栏let statusB…

springboot整合quartz通过数据库配置任务调度简单办法

简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中&#xff0c;Quartz是使用最广泛的定时调度框架。 在Quartz中的主要概念&#xff1a; Scheduler&#xff1a;调度任务…

C语言中文件的读写

不争输赢&#xff0c;只问对错 文章目录 一、文件的概述 二、什么是读写文件 三、文件处理的函数 1.文件的打开与关闭 2.文件的顺序读写 文件的顺序读写相关函数 scanf 和 printf 家族的对比及其区分 3.文件的随机读写 文件的随机读写函数 四、文件缓冲区 五…

【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

第一种&#xff08;直接展开并高亮关键字&#xff09; 效果图这样的&#xff0c;会把所有的有这些关键字的节点都展开 代码&#xff1a; 这里的逻辑就是通过递归循环把所有和关键字匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把关键字高亮…

Hadoop——DataGrip连接MySQL|Hive

1、下载 DataGrip下载&#xff1a;DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 2、破解 破解链接&#xff1a;https://www.cnblogs.com/xiaohuhu/p/17218430.html 3、启动环境 启动Hadoop&#xff1a;到Hadoop的sbin目录下右键管理员身份运行…

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 &#xff0c;并通过人们的 判断对决策方案的 优劣进行排序 &#xff0c;在此基础上进行定性和定量分析。它把人的思维过程…

预处理详解

目录 一、预定义符号 二、#define 1.认识#define 2.使用#define 2.1#define定义常量 2.2#define定义宏 2.3#define的替换规则 三、宏定义的其他内容 1.#和## 1.1# 1.2## 2.宏的副作用 3.宏的命名规则 4.undef 5.条件编译 一、预定义符号 #include<stdio.h> int…

通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置

目录 1.算法理论概述 串口通信模块 指令解析模块 位置控制模块 显示器驱动模块 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置是一种常见的应用场景&#x…