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

news2025/1/10 20:33:31

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)
select
    deptno,
    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.coloradmin.cn/o/582582.html

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

相关文章

信必优加入中国网络信息安全科技创新发展联盟

近日,信必优成功加入中国网络信息安全科技创新发展联盟。 中国网络信息安全科技创新发展联盟是在国务院国资委指导下,中国电科与公安部第一研究所、中国信息通信研究院、中国工业互联网研究院、中国科学院信息工程研究所、中国电信、中国联通、中国移动、…

2023年武汉住建厅七大员怎么报名?报名流程?精准题库一次过??

2023年武汉住建厅七大员怎么报名?报名流程?精准题库一次过?? 2023年武汉住建厅七大员是指施工员、质量员、资料员、材料员、机械员、标准员、劳务员,报的最多的可能就是施工员,质量员和资料员 报名流程: 1…

算法:回溯算法(以解决n皇后问题为例)

基本思想:回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如…

自动化测试套件(RSpec)

自动化测试套件(RSpec) RSpec example RSpec 是 Ruby 编程语言的测试框架。 它旨在通过提供用于定义和执行测试的领域特定语言 (DSL) 来促进行为驱动开发 (BDD)。 RSpec 允许您编写富有表现力和可读性的测试来描述代码的预期行为。 以下是 RSpec 的一些关键特性和概念&#…

电脑怎么打开隐藏文件夹?1分钟搞定!

案例:我的电脑上有一些文件夹是隐藏文件夹啊,我不知道如何打开它们,有没有小伙伴知道如何打开电脑上的隐藏文件夹吗? 【我能正常打开电脑上的其他文件夹,但是打不开电脑隐藏的文件夹,有没有小伙伴知道打开…

浪涌保护器的工作原理(SPD)

浪涌保护器(SPD)的工作原理如下: 在正常运行期间(例如,在没有浪涌的情况下),电涌保护器对安装它的电路系统没有影响。它的作用类似于开路,并保持有源导体和大地之间的隔离。 当发生…

2023年真无线蓝牙耳机买什么品牌好一些?盘点几款值得买的蓝牙耳机

蓝牙耳机是一种无线耳机,其通过蓝牙技术与其他设备进行连接,例如手机、电脑、平板电脑等。蓝牙耳机使得用户可以在不受线缆限制的情况下享受音频体验,而且还可以方便地进行通话,目前市场上有许多不同种类和品牌的蓝牙耳机&#xf…

【滤波】设计卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第8章节08-Designing-Kalman-Filters(设计卡尔曼滤波器)。 %matplotlib inline#format the book import book_format book_format.set_style()简介 在上一章节中,我们讨论了教…

Linux进程地址空间——上篇

目录 一. 前言: 二.进程地址空间 1.通过一个例子去初步的了解进程地址空间: 使用VS写了一段代码: 在Linux中使用vim编辑器写类似的代码: 结果解析: 2.什么是进程地址空间? 举个例子大家就明白了画饼的…

手机图片怎么提取文字?高效渠道一览

随着智能手机的普及,我们现在可以随时随地使用手机拍照记录生活中的点滴。然而,有时候我们拍照之后可能需要提取图片中的文字,比如拍下的菜谱、公告、名片等等。这时,我们就需要使用手机图片提取文字的功能。 - 采用OCR技术拍照识…

SpringBoot+Vue 实现网页版人脸登录、人脸识别!【全部开源】

介绍 FACE-UI 基于前后端分离Web端项目,主要实现了网页版的人脸登录,通过调取前端摄像头拍照,传入后台进行跟数据库人脸库的相似度比对。 技术点:Springboot,Mysql,JWT,VUE 2.X 等等技术实现&…

【Netty】使用 SSL/TLS 加密 Netty 程序(二十)

文章目录 前言一、SSL/TLS概述二、Sslhandler类 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHandler(四)ChannelP…

EnjoyVIID部署

1、下载 git clone https://gitee.com/tsingeye/EnjoyVIID.git 2、导入数据库 创建表enjoyviid 导入数据库(修改数据库文件里的编码) EnjoyVIID/sql/tsingeye-viid.sql 3、修改配置 vim EnjoyVIID/tsingeye-admin/src/main/resources/application-dev.yml 修改数据库连接、re…

clickhouse的BACKUP/RESTORE命令介绍

clickhouse的数据备份和恢复功能在大数据运维中是非常常用的功能,目前也有很多比较优秀的开源方案可供选择,比如clickhouse-backup, 以及clickhouse自带的clickhouse-copier。 本文介绍使用clickhouse自带的BACKUP和RESTORE命令进行备份和恢复…

vue实现验证码登陆

我们在使用 vue进行前端开发时,都需要登录验证,而在登录的过程中,用户需要输入自己的用户名和密码,如果是输错的话还需要进行再次输入。这样不仅容易造成用户密码泄露,还会影响用户体验。因此在我们的系统中都会存在验…

【深入浅出Spring Security(二)】Spring Security的实现原理

Spring Security的实现原理 一、实现原理二、内置Filter以及默认加载的Filter三、自动配置分析(SpringBootWebSecurityConfiguration)ConditionalOnMissingBean 四、自己配置SecurityFilterChain 一、实现原理 在 Spring Security 中,认证、…

交直流混合配电网潮流计算(统一求解法)

目录 1 主要内容 算例模型 统一求解法迭代方程 算法流程图 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序为matlab代码,采用统一求解法对交直流混合配电网进行潮流计算,统一迭代法又称统一求解法,其思路是将混联系统中的交流网…

FPGA串口发送数据

module Uart(input clk, //H3input rst, //F10output reg TX //串口发送脚M12 );reg[9:0] buffer 10b1_1100_1010_0; //接收方:0XCA parameter SND_T 5208; //9600bps reg [15:0] cnt 0; //数据宽度计数 always (posedge clk or negedge rst) beginif(!rs…

Unity游戏优化指南大全(持续更新中!)

Unity游戏优化指南大全 三个官方优化提示: 性能和优化 (Performance and Optimization) - 关于性能分析器以及性能和优化技巧的 Unity 学习教程。Best practices for performance optimization in Unity - 优化应用程序的最佳实践指南。Ultimate guide to profili…

【gstreamer】入门介绍

概述 GStreamer是一个基于流媒体的框架,是一个开放源代码的多媒体框架,用于创建音频和视频处理应用程序。它是一个运行在多个操作系统上的跨平台框架,支持多种不同的多媒体格式。 GStreamer框架的核心是基于插件的体系结构,插件…