Hive中的分区表与分桶表详解

news2024/9/16 23:09:46

目录

分区表和分桶表

 分区表

 分区表基本语法

1. 创建分区表

2. 分区表读写数据

1)写数据

(1)LOAD

(2)INSERT

2)读数据

3. 分区表基本操作

1)查看所有分区信息

2)增加分区

(1)创建单个分区

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

3)删除分区

(1)删除单个分区

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

4)修复分区

(1)ADD PARTITION

(2)DROP PARTITION

(3)MSCK REPAIR

 二级分区表

1)二级分区表建表语句

2)数据装载语句

3)查询分区数据

 动态分区

1)动态分区相关参数

2)案例实操

 分桶表

 分桶表基本语法

1)建表语句

2)数据装载

 分桶排序表

1)建表语句

2)数据装载


分区表和分桶表

 分区表

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

 分区表基本语法

1. 创建分区表
hive (default)> 
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
  1. 数据准备

     

    /opt/module/hive/datas/ 路径上创建文件 dept_20220401.log,并输入如下内容。

    10	行政部	1700
    20	财务部	1800
  2. 装载语句

    hive (default)> 
    LOAD DATA LOCAL INPATH '/opt/module/hive/datas/dept_20220401.log' 
    INTO TABLE dept_partition 
    PARTITION(day='20220401');
(2)INSERT

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

hive (default)> 
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)查看所有分区信息
hive> SHOW PARTITIONS dept_partition;
2)增加分区
(1)创建单个分区
hive (default)> 
ALTER TABLE dept_partition 
ADD PARTITION(day='20220403');
(2)同时创建多个分区(分区之间不能有逗号)
hive (default)> 
ALTER TABLE dept_partition 
ADD PARTITION(day='20220404') PARTITION(day='20220405');
3)删除分区
(1)删除单个分区
hive (default)> 
ALTER TABLE dept_partition 
DROP PARTITION (day='20220403');
(2)同时删除多个分区(分区之间必须有逗号)
hive (default)> 
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 REPAIR

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

hive (default)> 
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 命令。

 二级分区表

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

1)二级分区表建表语句
hive (default)> 
CREATE TABLE dept_partition2(
  deptno INT,   -- 部门编号
  dname STRING, -- 部门名称
  loc STRING    -- 部门位置
)
PARTITIONED BY (day STRING, hour STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
2)数据装载语句
hive (default)> 
LOAD DATA LOCAL INPATH '/opt/module/hive/datas/dept_20220401.log' 
INTO TABLE dept_partition2 
PARTITION(day='20220401', hour='12');
3)查询分区数据
hive (default)> 
SELECT *
FROM dept_partition2 
WHERE day='20220401' AND 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。

SET hive.exec.max.created.files=100000;

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

SET hive.error.on.empty.partition=false;
2)案例实操

需求:将 dept 表中的数据按照地区(loc 字段),插入到目标表 dept_partition_dynamic 的相应分区中。

(1)创建目标分区表

hive (default)> 
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;
hive (default)> 
INSERT INTO TABLE dept_partition_dynamic 
PARTITION(loc) 
SELECT 
  deptno, 
  dname, 
  loc 
FROM dept;

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

hive (default)> SHOW PARTITIONS dept_partition_dynamic;

 分桶表

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

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

 分桶表基本语法

1)建表语句
hive (default)> 
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
...
1014	student14
1015	student15
1016	student16

(2)导入数据到分桶表中

hive (default)> 
LOAD DATA LOCAL INPATH '/opt/module/hive/datas/student.txt' 
INTO TABLE stu_buck;

(3)查看创建的分桶表中是否分成 4 个桶

 

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

 分桶排序表

1)建表语句
hive (default)> 
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)导入数据到分桶表中

hive (default)> 
LOAD DATA LOCAL INPATH '/opt/module/hive/datas/student.txt' 
INTO TABLE stu_buck_sort;

(2)查看创建的分桶表中是否分成 4 个桶

         

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

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

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

相关文章

数据库MySQL零基础-下【详细】

目录 六、事务/视图/触发器/存储过程 1、事务的理解 (1)事务的理解 (2)事务的特性 2、事务的应用 (1)事务的开启与提交 # 语法 # 示例 (2)开启autocommit(临时生…

MybatisPlus静态工具 通用枚举

静态工具 有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,就在方法例多给出一个参数,操作的实体类类型。…

P3285 [SCOI2014] 方伯伯的OJ

*原题链接* 本题与NOIP2017列队有很多共通之处,都是一开始给我们一个排好编号的队列,然后进行一些操作。 如果n的范围不大,我们会如何做呢?很容易想到权值线段树,以编号为下标建立权值线段树,维护每个下标…

WEB攻防-ASP安全MDB下载植入IIS短文件名写权限解析

知识点: 1、ASP环境搭建组合; 2、ASP-数据库下载&植入; 3、IIS-短文件&解析&写权限; WEB安全攻防 1、web源码; 2、开发语言; 3、中间件平台; 4、数据库类型; 5、…

百度快照劫持之JS劫持诊断与恢复一例

劫持现象: 百度搜索结果中,被劫持网站出现在搜索结果中, 点击进入网站,网站显示正常,数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果,正常进入网站缺不会跳转到彩票网站。 初步认…

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名…

GO语言快速入门(比较乱)

一、环境安装 1、安装Go环境 1、官网下载 2、cmd-->go version 3、环境变量 GOROOT:go安装路径 GOPATH:go存放代码的路径 4、GOWorks新建三个文件 5、go env查看配置 2、安装编辑器 GoLand或者VSCode 3、HelloWorld package main //一个程序只有一个…

设计模式学习[5]---装饰模式

文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时,基于原有的设计类图进行讨论。其中涉及到了装饰模式,因为书本很早已经看过一遍,所以谈及到这个名词的时候…

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在…

php转职golang第二期

以下是一份简单的 Go 基本语法笔记: 变量与常量: • var 声明变量。• const 声明常量。数据类型: • 整型、浮点型、布尔型、字符串型等。流程控制: • if-else 语句。• for 循环。函数: • 定义和调用函数。数…

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接:394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法:记忆化搜索DFS 算法&#xf…

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成&…

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一) 古话说得好,要有天气预报,首先需要有天气,和预报。 今天给大家介绍一个好用的天气预报API:和风天气。以及webAPI的使用方法~&a…

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类(二) 本文中的标签在什么位置使用? 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…

JavaWeb后端开发总结(3)

AOP基础 AOP概述 首先我们要知道AOP是什么? 看下图 个人解析: AOP叫做面向切面编程,但是实际上就是面向方法编程 图中下面一部分是一个AOP的案例 AOP快速入门案例代码实现 案例:测出业务中各个业务方法所需的执行时间 如果…

怎么利用NodeJS发送视频短信

随着5G时代的来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其大的潜力。视频群发短信以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受&#xff0…

单片机DMA原理及应用详解(上篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获! 目录 一、DMA简介 二、DMA原理 三、DMA中断 1. DMA中断的工作原理 2. DMA中断的优点 3. DMA中断的配置和处理 4. 应用场景 四、结语 一、DMA简介 1、DMA(D…

数据分析训练模型后输出模型评估报告

数据分析训练模型后输出模型评估报告 1、模型评估指标 1.1、概念: A:n个正样本,检测到是真值的数量 B:m个负样本,检测到是真值的数量 C:n个正样本,检测到假值的数量 D:m个负样本,检测到假值的数量 1.2、准确率(Accuracy) 正确预测的样本数量与总样本数量的比值。…

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhua…