hive的分区表和分桶表详解

分区表

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

静态分区表基本语法

创建分区表
create table dept_partition
(deptno int,    --部门编号dname  string, --部门名称loc    string  --部门位置
)partitioned by (day string)row format delimited fields terminated by '\t';
写数据:

创建文件写入以下数据并上传到HDFS上面:

10	行政部	1700
20	财务部	1800

在这里插入图片描述

load加载数据:
load data inpath 'hdfs://flinkv1:8020/input/dept_20220401.log'into table dept_partitionpartition(day='20220401');
insert加载数据

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

insert overwrite table dept_partition partition (day = '20220402')
select deptno, dname, loc
from dept_partition
where day = '20220401';
读数据

查询分区表数据时,可以将分区字段看作表的伪列,可像使用其他字段一样使用分区字段。

select deptno, dname, loc ,day
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');

在这里插入图片描述

删除分区

(1)删除单个分区

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

在这里插入图片描述

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

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

在这里插入图片描述

修复分区

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

说明::该命令会增加HDFS路径存在但元数据缺失的分区信息。

msck repair table table_name add partitions

该命令会删除HDFS路径已经删除但元数据仍然存在的分区信息。

msck repair table table_name drop partitions

该命令会同步HDFS路径和元数据分区信息,相当于同时执行上述的两个命令。

msck repair table table_name sync partitions

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

msck repair table table_name

二级分区表

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

二级分区表建表语句
create table dept_partition2(deptno int,    -- 部门编号dname string, -- 部门名称loc string     -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
数据装载语句
load data inpath 'hdfs://flinkv1:8020/input/dept_20220401.log'into table dept_partition2partition(day='20220401', hour='12');
查询分区数据
select * 
from dept_partition2 
where day='20220401' and hour='12';

在这里插入图片描述

动态分区

动态分区是指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态的决定。使用动态分区,可只用一个insert语句将数据写入多个分区。

动态分区相关参数

(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
案例实操

需求:将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;

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

show partitions dept_partition_dynamic;

在这里插入图片描述

分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。
分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。

分桶表基本语法

(1)建表语句

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

(2)数据装载
创建student.txt文件,并输入如下内容,上传HDFS

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 inpath 'hdfs://flinkv1:8020/input/student.txt'into table stu_buck;

(3)查看创建的分桶表中是否分成4个桶
在这里插入图片描述

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

分桶排序表

(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)数据装载

load data inpath 'hdfs://flinkv1:8020/input/student.txt'into table stu_buck_sort;

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

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

相关文章

HBase的安装与简单操作

文章目录 第1关:Hbase数据库的安装第2关:创建表第3关:添加数据、删除数据、删除表 第1关:Hbase数据库的安装 编程要求 根据上述步骤安装配置好HBase数据库,并启动成功。 测试说明 若安装配置成功,则程序会…

mfc配置halcon环境

新建mfc窗体 选择基于对话框 打开项目属性 1、附加包含目录添加: $(HALCONROOT)\include;$(HALCONROOT)\include\halconcpp 2、链接器->常规->附加库目录 $(HALCONROOT)\lib\x64-win64 3、链接器->输入->附加依赖项 halcon.lib;halconcpp.lib 在对话…

如何在PHP中处理日期和时间?

在 PHP 中,你可以使用内置的 DateTime 类和相关函数来处理日期和时间。以下是一些常见的日期和时间操作的示例: 使用 DateTime 类: 获取当前日期和时间: $currentDateTime new DateTime(); echo $currentDateTime->format(Y-…

sudo apt-get安装的包和pip install以及conda install安装的包的区别

sudo apt-get、pip install 和 conda install 是用于在 Linux 系统中安装软件包的不同方式,它们的区别如下: sudo apt-get: sudo apt-get 是在基于 Debian 的 Linux 发行版(如 Ubuntu、Debian)中用于管理软件包的命令…

cfa一级考生复习经验分享系列(五)

先说一下背景吧,在职备考,工作领域和金融相关,本身也是金融专业毕业,说来惭愧,工作2年才报名参加CFA考试。工作后再参加考试会有一点心态上的转变,毕竟没有那么多时间去浪费了,所以每次考试会尽…

网络入门---守护进程

目录标题 什么是守护进程会话的理解setsid函数daemonSelf函数模拟实现测试 什么是守护进程 在前面的学习过程中我们知道了如何使用TCP协议和UDP协议来实现通信,比如说登录xshell运行了服务端: 然后再登录一个xshell运行客户端并向服务端发送信息&#…

基于若依搭建微服务nacos版本(ruoyi-Cloud前后端分离)

说明:本文介绍基于Ruoyi-Cloud前后端分离nacos版本的微服务从0到1的搭建过程,同时新增一个新的微服务模块。是基于官方文档的补充说明,需要结合Ruoyi-Cloud的官方文档 https://doc.ruoyi.vip/ruoyi-cloud/ 如果直接查看官方文档便可成功部署&…

Linux--权限问题(2)

目录 前文 前言 1. 文件的权限 1.1 文件的访问者分类 1.2 文件类型和访问权限(事物属性) 2. 如何修改文件的权限 3.对比权限有无的表现 4.修改用户角色 5.修改权限的第二种做法 6.目录的权限 7.默认权限 前文 Linux--权限问题(1&#…

云原生之深入解析Kubernetes本地持久化存储方案OpenEBS LocalPV的最佳实践

一、K8s 本地存储 K8s 支持多达 20 种类型的持久化存储,如常见的 CephFS 、Glusterfs 等,不过这些大都是分布式存储,随着社区的发展,越来越多的用户期望将 K8s 集群中工作节点上挂载的数据盘利用起来,于是就有了 loca…

一种用于心音分类的轻量级1D-CNN+DWT网络

这是由National Institute of Technology Rourkela, Central University of Rajasthan发布在2022 ICETCI的论文,利用离散小波变换(DWT)得到的多分辨率域特征对1D-CNN模型进行心音分类训练。 预处理& DWT 由于FHS和各种病理声的频率范围在500hz以下[5]&#xff…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头,用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到,不同…

7.3 lambda函数

一、语法 1.基础语法 [capture](paramLists) mutable ->retunType{statement} capture。捕获列表,用于捕获前文的变量供lambda函数中使用,可省略。(paramLists)。参数列表,可省略。mutable。lambda表达式默认具有常量性,可以…

电阻的运用

本文引注 https://baijiahao.baidu.com/s?id1749115196647029942&wfrspider&forpc 一、零欧电阻 在电子电路设计时经常用到的一种元件就是电阻,我们都知道电阻在电路中起到分压限流的作用。然而,实际使用时会用到一种特殊的电阻:零…

用Kotlin抓取微博数据并进行热度预测

闲来无事,逛逛微博,看着每条热度很高的博文趣事,心想能否通过爬虫抓取微博热度并进行趋势分析,说干就干,这里需要注意的问题我会一一标注。 爬虫ip信息的设置是在爬虫程序中进行的。爬虫ip信息可以帮助爬虫程序在访问…

使用React实现随机颜色选择器,JS如何生成随机颜色

背景 在标签功能中,由于有「背景色」属性,每次新增标签时都为选择哪种颜色犯难。因此,我们思考如何通过JS代码生成随机颜色,提取一个通用的随机颜色生成工具,并基于React框架封装随机颜色选择器组件。 实际效果 原理…

RabbitMQ 命令

Docker # 进入容器 > docker exec -it rabbitmq /bin/bash# 帮助 > rabbitmq-service help# 查看所有队列 > rabbitmqctl list_queues Windows 进入安装目录【D:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin】输入cmd # 帮助 > rabbitmq-servic…

在Node.js中停止使用dotenv

dotenv 是一个从 .env 文件中加载环境变量的包,npm 周下载量有三千五百万。在 Node.js v20.6.0 中,已经内置了对 .env 文件的支持,这篇文章将演示如何在 Node.js 中访问 .env 中的环境变量。 配置 创建一个最简单的 Express 应用程序&#…

融云即时通讯的产品优势

1、开箱即用的 UI 组件 让开发者不用撰写 UI 界面代码即可快速实现 IM 功能 2、健壮稳定 全球范围提供多个数据中心、物理覆盖全球用户 3、快速接入 标准通信功能 1 天即可快速接入 4、接口丰富 满足复杂业务需求 详情查看:融云-为用户提供IM即时通讯和实时音视频通…

Parade Series - Message Interaction

if (true) {Swal.fire("节目发布", "发布完毕", "success");event.preventDefault(); } if (false) {Swal.fire("节目发布", "发布失败", "error");event.preventDefault(); }if (true) {for (var i 0; i < b…

AI日报:OpenAI向新用户重新开放ChatGPT Plus订阅

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 总览Chatgptplus重新开放订阅#暂停原因功能 OpenAI的1000万美元安全人工智能拨款拨款初衷学术捐赠 总览 ChatGPT Plus再次向新用户开放&#xff0c;但目前每三小时限制发送40条消息。 OpenAI还宣布拨款1000万美元…