大数据技术之Hive(四)分区表和分桶表、文件格式和压缩

news2024/9/23 21:32:19

一、分区表和分桶表

1.1 分区表partition

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

1.1.1 分区表基本语法

a. 创建分区表

create  table  dept_partition(
    deptno   int,
    dname    string,
    loc    string
)
    partitioned  by  (day  string)
    row  format  delimited  fields  terminated  by  '\t'
    lines terminated by '\n';

b. 分区表读写数据

写数据--load

load data local inpath '/opt/stufile/dept_20230225.log'
into table dept_partition
partition (day='20230225')

写数据--insert

insert overwrite table dept_partition partition (day='20230226')
select deptno,dname,loc from dept_partition where day='20230225';

读数据

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

select deptno,dname,loc,day
from dept_partition
where day='2020-04-01'

c. 分区表基本操作

查看所有分区信息

show prtitions dept_partition;

增加分区

创建单个分区
alter table dept_partition
add partition(day='20220403');

同时创建多个分区(分区之间不能有逗号)
alter table dept_partition
add partition(day='20220404') partition(day='20220405');

删除分区

删除单个分区
alter table dept_partition
drop partition(day='20220403');

同时删除多个分区(分区之间必须有逗号)
alter table dept_partition
drop partition(day='20220404'), partition(day='20220405');

d. 修复分区

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

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

add partition

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

drop partition

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

msck

若分区元数据和 HDFS 的分区路径不一致,还可使用 msck 命令进行修复。

msck repair table table_name [add/drop/sync partitions];

1.1.2 二级分区表

如果一天内的日志数据量也很大,可以创建二级分区表,例如可以在按天分区的基础上,再对每天的数据按小时进行分区。

二级分区表建表语句

create create table dept partition2(
    dleptno int,
    dnamne string,,
    loc string
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';

数据装载语句

load data local inpath '/opt/stufile/dept_20220401.log'
into table dept_partition
partition (day='20220401', hour='12');

查询分区数据

select * 
from dept_partition2
where day='20220401' and hour='12';

1.1.3 动态分区

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

1.2 分桶表bucket

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

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

1.2.1 分桶表基本语法

建表语句

create table stu buck(
    id int,
    name string
)
clustered 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;

1.2.2 分桶排序表

建表语句

create table stu buck(
    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;

二、文件格式和压缩

2.1hive文件格式

为 Hive 表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。Hive 表数据的存储格式,可以选择 text file、orc、parquet、sequence file 等。

2.1.1 Text File

文本文件是 Hive 默认使用的文件格式,文本文件中的一行内容,就对应 Hive 表中的行记录。

可通过以下建表语句指定文件格式为文本文件:

create table textfile_table
(column specs)
stored as textfile;

2.1.2 ORC

ORC (Optimized Row Columnar) file format 是 Hive 0.11版里引入的一种列式存储的文件格式。ORC文件能够提高 Hive 读写数据和处理数据的性能。

与列式存储相对的是行式存储,下图是两者的对比:

行存储的特点

查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。

列存储的特点

因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

前文提到的 text file 和 sequence file 都是基于行存储的,orc 和 parquet基于列式存储的。

每个Orc 文件由 Header、Body 和 Tail 三部分组成。

其中Header内容为ORC,用于表示文件类型。

Body由1个或多个 stripe 组成,每个 stripe 一般为 HDFS 的块大小,每一个 stripe 包含多条记录,这些记录按照列进行独立存储,每个 stripe 里有三部分组成,分别是 index Data, Row Data,Stripe Footere。

index Data:一个轻量级的 index,默认是为各列每隔 1w 行做一个索引。每个索引会Index Data:记录第n万行的位置,和最近一万行的最大值和最小值等信息。

Row Data:存的是具体的数据,按列进行存储,并对每个列进行编码,分成多个Stream 来存储。

Stripe Footer:存放的是各个Stream 的位置以及各 column 的编码信息。

Tail 由File Footer PostScript 组成。File Footer 中保存了各 Stripe 的其实位置、索引长度、数据长度等信息,各 Column 的统计信息等;PostScript 记录了整个文件的压缩类型以及Fle Footer 的长度信息等。

在读取ORC 文件时,会先从最后一个字节读取 PostScript 长度,进而读取到 PostScript,从里面解析到 File Footer 长度,进而读取 FileFooter,从中解析到各个Stripe信息,再读各个stripe,即从后往前读。

建表语句

create table orc table
(column specs)
stored as orc
tblproperties (property_name=property value, ...) ;

ORC文件格式支持的参数如下:

参数

默认值

说明

orc.compress

ZLIB

压缩格式,可选项:NONE、ZLIB、SNAPPY

orc.compress.size

262,144

每个压缩快的大小(ORC文件是分块压缩的)

orc.tripe.size

67,108,864

每个stripe的大小

orc.row.index.stride

10,000

索引步长(每隔多少行数据建一条索引)

2.13 Parqust

Parquet 文件是 Hadoop 生态中的一个通用的文件格式,它也是一个列式存储的文件格式。

建表语句

create table parquet_table
(column specs)
stored as parcuet
tbproperties (property_name=propertu_value, ...);

支持的参数如下:

参数

默认值

说明

parquet.compression

uncompressed

压缩格式,可选项:uncompressed,snappy,gzip,lzo,brotli,lz4

parquet.block.size

134217728

行组大小,通常与HDFS块大小保持一致

parquet.page.size

1048576

页大小

2.2 压缩

在 Hive 表中和计算过程中,保持数据的压缩,对磁盘空间的有效利用和提高查询性能都是十分有益的。

2.2.1 hive表数据进行压缩

在 Hive 中,不同文什类型的表,声明数据压缩的方式是不同的。

TextFile

若一张表的文件类型为 TextFile,若需要对该表中的数据进行压缩,多数情况下,无需在建表语句做出声明。直接将压缩后的文件导入到该表即可,Hive 在查询表中数据时,可自动识别其压缩格式,进行解压。

需要注意的是,在执行往表中导入数据的 SQL 语句时,用户需设置以下参数,来保证写入表中的数据是被压缩的。

——SQL语句的最终输出结果是否压缩
set hive.exec.compress.output=true;
——输出结果的压缩格式
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

ORC

若一张表的文件类型为 ORC,若需要对该表数据进行压缩,需在建表语句中声明压缩,格式如下:

create table orc table
(column specs)
stored as orc
tblproperties("orc.compress"="snappy");

Parquet

若一张表的文件类型为 parquet,若需要对该表数据进行压缩,需在建表语句中声明压缩,格式如下:

create table orc table
(column specs)
stored as parquet
tblproperties("parquet.compress"="snappy");

2.2.2 计算过程中使用压缩

单个MR的中间结果进行压缩

单个MR 的中间结果是指 Mapper 输出的数据,对其进行压缩可降低 shuffle 阶段的网络10,可通过以下参数进行配置:

——开启MapReduce中间数据压缩功能
set mapreduce.map.output.compress=true;

——设置MapReduce中间数据的压缩方式
set mapreduce.map.output.codec=org.apache.hadoop.io.compress.SnappyCodec;

单条SQL语句的中间结果进行压缩

单条 SQL 语句的中间结果是指,两个 MR(一条 SQL 语可能需要通过 MR 进行计算)之间的临时数据,可通过以下参数进行配置:

——是否对两个MR 之间的临时数据进行压缩
set hive.exec.compress .intermediate=true;
——压缩格式(以下示例为 snappy)
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

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

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

相关文章

Python 不同分辨率图像峰值信噪比[PSNR]

PNNR:全称为“Peak Signal-to-Noise Ratio”,中文直译为峰值信噪比 前言 一、定义 二、Python代码 1.自定义 2.Tensorflow 总结 前言 峰值信噪比是一种衡量图像质量的指标,描述的是最大值信号与北京噪音之间的关系。 一般来说,P…

Allegro如何删除铜皮上多余的空洞操作指导

Allegro如何删除铜皮上多余的空洞操作指导 在做PCB设计的时候,设计铜皮的时候是不希望铜皮上有多余的空洞的,设计完成前需要把多余的空洞删除,如下图 如何删除,具体操作如下 点击Shape点击Manual Void/Cavity

springboot中集成redis,二次封装成工具类

大家好,我是雄雄,欢迎关注微信公众号:** 雄雄的小课堂 ** 现在是:2023年2月28日11:01:56 前言 redis大家应该都不陌生,我们在好多场景下都会使用,最近在面试别人的时候,也会问一些关于redis的…

华为OD机试题,用 Java 解【求符合要求的结对方式】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

博客系统--自动化测试

项目体验地址(账号:123,密码:123)http://120.53.20.213:8080/blog_system/login.html项目后端说明:http://t.csdn.cn/32Nnv项目码云Gitee地址:https://gitee.com/GoodManSS/project/tree/master…

【极狐 GitLab】在 web 端合并分支

一、概述 极狐GitLab是GitLab DevOps平台的中国发行版,一套完备的一站式DevOps平台,从根本上改变了开发、安全和运维团队协作和软件构建方式。极狐GitLab从构思到生产发布,帮助团队提高生产效率,将迭代周期从数周缩短至几分钟&am…

【Spring事物三千问】Spring的事务管理与MyBatis事物管理结合的原理

Spring的事务管理与MyBatis事物管理结合的原理前言正文原生的 MyBatis 的事务处理SqlSessionTransactionMyBatis 事务管理 与 Spring 事务管理的融合SpringManagedTransactionSqlSessionTemplateSqlSessionInterceptormybatis-spring 融合的原理连接获取 & 开启事务连接的关…

【Linux】理解进程地址空间

🍎作者:阿润菜菜 📖专栏:Linux系统编程 ​我们在学习C语言的时候,都学过内存区域的划分如栈、堆、代码区、数据区这些。但我们其实并不真正理解内存 — 我们之前一直说的内存是物理上的内存吗? 前言 我们…

18- TensorFlow实现CIFAR10分类 (tensorflow系列) (项目十八)

项目要点 导入cifar图片集: (train_image, train_label), (test_image, test_label) cifar.load_data() # cifar keras.datasets.cifar10图片归一化处理: train_image train_image / 255定义模型: model keras.Sequential() 输入层: model.add(layers.Conv2D(64, (3, 3…

HTML基础语法

一 前端简介构成语言说明结构HTML页面元素和内容表现CSS网页元素的外观和位置等页面样式(美化)行为JavaScript网页模型的定义和页面交互二 HTML1.简介HTML(Hyper Text Markup Language):超文本标记语言。网页结构整体&…

Kubernetes05: Pod

Kubernetes05: Pod 1、概述 1)最小部署的单元 2)K8s不会处理容器,而是Pod,Pod里边包含多个容器(一组容器的集合) 3)一个Pod中的容器共享一个网络命名空间 4) Pod是短暂存在的东西(重…

使用shiroshiro整合其他组件

什么是shiro? 一款apache公司出品的Java安全框架,主要用于设计针对应用程序的保护,使用shiro可以完成认证、授权、加密、会话管理等。保证系统稳定性、数据安全性 优势:易于使用、易于理解、兼容性强(可以与其他框架集…

SE-SSD论文阅读

摘要 本文提出了一种基于自集成单级目标检测器(SE-SSD)的室外点云三维目标检测方法。我们的重点是利用我们的公式约束开发软目标和硬目标来联合优化模型,而不引入额外的计算在推理中。具体来说,SE-SSD包含一对teacher 和student ssd,在其中我…

Mac 安装 Java 反编译工具 JD-GUI

Mac 安装 Java 反编译工具 JD-GUI JD-GUI 是一款 Java 反编译工具,可以方便的将编译好的 .class 文件反编译为 .java 源码文件,用于开发调试、源码学习等。 官网地址:http://java-decompiler.github.io Git 地址:https://github…

直播美颜sdk是什么?它是怎么让用户”变美“的?

如今,直播美颜sdk、手机摄影、短视频以及社交软件的盛行,让“拍照”成为人们日常生活中不可或缺的一部分。随着直播美颜sdk技术的不断升级,手机摄影的质量也越来越高。有统计数据显示,2018年中国智能手机用户已经达到了7亿人&…

美国最新调查显示 50% 企业已在用 ChatGPT,其中 48% 已让其代替员工,你怎么看?

美国企业开始使用ChatGPT,我认为这不是什么新闻。 如果美国的企业现在还不使用ChatGPT,那才是个大新闻。 据新闻源显示,已经使用chatGPT的企业中,48%已经让其代替员工工作。 ChatGPT的具体职责包括:客服、代码编写、招…

HTB-remote

HTB-remote信息搜集开机提权信息搜集 nmap 较为感兴趣的端口: 2180nfs 首先尝试21端口,可以看到并没有文件在ftp服务器里面,而且也无法上传文件。 80端口。 在contact里面找到了能够登录的网站。 经过简单的测试发现可能不存在sql注…

逆向、安全、工具集

0、安卓逆向环境 r0env 原味镜像介绍文章:https://mp.weixin.qq.com/s/gBdcaAx8EInRXPUGeJ5ljQ 原味镜像介绍视频:https://www.bilibili.com/video/BV1qQ4y1R7wW/ 百度盘:链接:https://pan.baidu.com/s/1anvG0Ol_qICt8u7q5_eQJw 提取码:3x2a …

【Spring源码】Spring AOP的核心概念

废话版什么是AOP关于什么是AOP,这里还是要简单介绍下AOP,Aspect Oriented Programming,面向切面编程,通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护,使用AOP可以降低各个部分的耦合度,提高…

openfeign负载均衡策略 | Spring Cloud 5

一、Spring Cloud LoadBalancer介绍 Spring Cloud LoadBalancer是Spring Cloud官网提供的一个客户端负载均衡器,功能类似于Ribbon。在Spring Cloud Nacos 2021移除了中Ribbon组件,Spring Cloud在Spring Cloud Commons项目中,添加了Spring Cl…