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

目录

分区表和分桶表

 分区表

 分区表基本语法

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.rhkb.cn/news/421837.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 知识点记录

王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址&#xff1…

ctf.show靶场ssrf攻略

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 web351 解析:post传入url参数他就会访问。 解法: hackbar传入url参数写入https://127.0.0.1/flag.php web352 解析:post传入url参数,不能是127.0.0.1和localhost 解法:缩写127.1传入 web353 解析…

数据分析与挖掘课程相关资源

这是在gitee上整的关于这门课的一个开源项目。 https://gitee.com/rainpet/python-data-analysis-and-mining-demo 头歌平台。 常见问题: 1、如何确认conda的版本,执行如下命令: conda list anaconda$2、实验室登陆后,无法上网&a…

<<编码>> 第 6 章 发报机与继电器(Telegraphs and Relays) 示例电路

##继电器 info::操作说明 注: 此处输入处未添加电源及开关, 因此不能控制继电器的开合 读者可自行添加电源及开关, 或查看后续可操作的例子 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/c…

百度视频排名代发(百度视频秒收录代发)

百度视频排名代发(百度视频秒收录代发) 代做灰色关键词百度排名(代发百度灰色词外推)#百度推广#关键词排名#灰色词排名 推荐阅读: 百家号图文排名代发:文章客服系统挂载电话https://www.bsw80.com/post/471.html 很多老板表示想…

Java控制台+activiti+springboot+mybatis实现账务报销工作流程

Java控制台activitispringbootmybatis实现账务报销工作流程 一、系统介绍二、功能展示1.代码展示2.员工报销3.账务审批4.总经理审批 四、其它1.其他系统实现 一、系统介绍 系统主要功能: 员工:填写报销单 账务审批:报销金额小于1000账务经理…

I.MX6U裸机-汇编LED灯实验

汇编基础语法参考:初识汇编语言-CSDN博客 本文主要参考正点原子《I.MX6U 嵌入式 Linux 驱动开发指南 》第八章 STM32 GPIO 回顾 我们一般拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO,控制其 GPIO 输出高低电平,我们学习…

【CTF刷题5】刷题记录(9.11)

ctfshow愚人杯 easy_ssti 考点:ssti漏洞 查看源码 下载这个文件 打开查看代码,分析可能在/hello/路径下存在ssti漏洞 from flask import Flask from flask import render_template_string,render_template app Flask(__name__)app.route(/hello/) def h…

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

rose 聊开源—2 如何快速上手一个开源项目

在前面的一篇开源项目系列中,主要介绍了目前开源项目蓬勃发展的态势,并且拥有一个开源项目,对我们个人履历、职业发展等都有非常多的好处。 这一次就来跟大家分享一下,面对一个开源项目,我们应该如何上手,快…

fpga系列 HDL:全连接层的浮点数乘法器FM实现

此代码实现了一个简单的浮点数乘法器,处理两个32位的单精度浮点数。它通过将两个浮点数的有效数字部分进行乘法操作,并对结果进行规范化以生成最终的浮点乘积。 主要逻辑与电路 去掉指数对齐部分后的主要逻辑电路图示: 代码 // https://…

828华为云征文 | 云上私人数据管家,jMalCloud个人网盘在华为云Flexus的Docker化部署实践

华为云服务器Flexus X实例介绍 华为云Flexus云服务器X实例,是由国家科技进步奖获得者、华为公司Fellow、华为云首席架构师顾炯炯牵头研发。它基于擎天QingTian架构、瑶光云脑、盘古大模型等根技术创新,是业界首款应用驱动的柔性算力云服务器,…

C语言 | Leetcode C语言题解之第400题第N位数字

题目: 题解: //解题思路:计算当前已经经过了多少位,当第一次超过n时,开始获取第n位 int findNthDigit(int n){int i, j, tem_1 10, tem_2 1, res; long count 0; /*i和j用于循环,count用…

容器化安装jenkins稳定版长期维护版本LTS

前提已有 docker-compose和docker-ce环境,这里安装稳定的Lts版本即可。 选择稳定版本 这里选择LTS 稳定长期维护的版本 在docker镜像找到LTS稳定版本 部署jenkins服务 创建持久化数据目录 jenkinsdata]# pwd /data/jenkinsdata编写docker-compose文件 jenkins_…

Tranformer分布式特辑

随着大模型的发展,如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时,不存储当前节点的中间结果,在反向传播时重新计算,从而起到降低显存占用的作用 Low Precision…

创建Django 项目

创建一个新的 Django 项目: django-admin startproject myproject cd myproject 在 Django 项目中创建一个新的应用: python manage.py startapp myapp设置数据库 编辑 myproject/settings.py 文件中的数据库设置: DATABASES {default:…

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架…

僵尸网络开发了新的攻击技术和基础设施

臭名昭著的 Quad7 僵尸网络(也称为 7777 僵尸网络)不断发展其运营,最近的发现表明其目标和攻击方法都发生了重大变化。 根据 Sekoia.io 的最新报告,Quad7 的运营商正在开发新的后门和基础设施,以增强僵尸网络的弹性&a…

unity3d入门教程一

unity3d入门教程一 2.1-开发环境2.2 新建项目3.1编辑器页面3.2场景3.3添加资源4.1场景视图4.2游戏对象4.3坐标系4.4游戏对象的操作4.5摄像机 2.1-开发环境 https://unity.com/ https://unity.cn/ 安装时若卡住,打开路径自动安装 C:\Users\zhaocai\AppData\Local\T…

TAPD卓越版的全面评测:超强的功能与用户体验优势

在数字化转型浪潮中,项目管理和团队协作工具成为提升企业效能的关键。其中,腾讯研发的TAPD卓越版,作为一款集敏捷项目管理、研发管理和知识管理为一体的全方位协作平台,深受众多企业的青睐。本文将从功能特性、用户体验、以及实际…