Hive的数据存储格式

目录

一、前言

二、存储格式

2.1、文本格式(TextFile)

2.1.1、定义与特点

2.1.2、存储与压缩

2. 1.3、使用场景

2.2、行列式文件(ORCFile)

2.2.1、ORC的结构 

2.2.2、ORC的数据类型

2.2.3、ORC的压缩格式

2.2.3、ORC存储格式建表

2.3、Apache Parquet

2.3.1、Parquet基本结构

2.3.2、Parquet的压缩格式

1、Snappy:

2、Zlib:

3、LZO:

4、Gzip:

三、ORC与Parquet的使用

一、前言

本文重点讲解Hive的存储格式,它是Hive操作数据的基础。选择一种合适的底层数据存储文件格式,即使不改变sql的情况下,对性能也是有很大的提升。同时,找工作面试也会问存储格式相关的题目。分享给大家,一起学习探讨。

二、存储格式

Hive数据存储支持的格式有文本格式(TextFile)、二进制序列化文件 (SequenceFile)、行列式文件(RCFile)、Apache Parquet和优化的行列式文件(ORCFile)。其中,ORCFileApache Parquet,以其高效的数据存储 和数据处理性能得以在实际的生产环境中大量运用。

本文将讲解文本格式(TextFile)、优化的行列式文件(ORCFile)、Apache Parquet。

2.1、文本格式(TextFile)

2.1.1、定义与特点

TextFile即正常的文本格式,是Hive中最基础且默认的存储格式。这种格式的文件在HDFS(Hadoop Distributed File System)上以明文形式存储,因此可以直接通过hadoop fs -cat命令查看,或者从HDFS下载后直接读取。TextFile的存储特点是每一行通常代表一条记录,字段之间可以通过指定的分隔符进行分割。

当你创建一个Hive表时,如果没有指定存储格式,那么默认就会使用TextFile。例如:

CREATE TABLE my_table(id INT, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

在这个例子中,没有指定存储格式,所以默认使用TextFile。

如果你想指定使用TextFile,可以这样写:

CREATE TABLE my_table(id INT, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

2.1.2、存储与压缩

  1. 存储方式TextFile以行式存储为主,即数据按行组织,每行包含完整的记录。这种存储方式适合字段较少或经常需要获取全字段数据的场景。

  2. 压缩支持TextFile默认不进行压缩,但支持结合Gzip、Bzip2、Snappy等压缩算法使用。然而,当TextFile表压缩后再进行解压(即反序列化)时,会耗费较多的时间。此外,压缩后的TextFile文件不支持split,这意味着Hive无法对数据进行并行操作,从而可能影响查询性能。

2. 1.3、使用场景

仅仅用在文本文件导入到Hive的表中,需要建立这种表或者适合字段较少或经常需要获取全字段数据。

2.2、行列式文件(ORCFile

ORC存储的文件是一种带有模式描述的行列式存储文件。ORC有别于传统的数据存储文件,它会将数据先按行组进行切分,一个行组内部包含若干行,每一行组再按列进行存储,如图下图所示:

2.2.1、ORC的结构 

我们知道传统的行式数据库,数据按行存储,在没有使用索引的情况下,如果要查询一个字段,需要将整行的数据查找出来,再找到相应的字段,这样的操作是比较消耗I/O资源的。最初的解决方式是建立Hive索引。

Hive建立索引是一项比较消耗集群资源的工作,并且需要时刻关注是否更新。数据如有更新,就需要对索引进行重建。数据有更新却没有及时重建或者忘了重建,则会引发使用过程的异常。正是建立Hive索引成本高,又极容易引发异常,所以在实际生产中,Hive索引很少被用到。这时候有些人就想到使用列式存储。

相比于行式存储,列式存储的数据则是按列进行存储,每一列存储一个字段的数据,在进行数据查询时就好比走索引查询,效率较高。但是如果需要读取所有的列,例如一个数据平台刚接入数据,需要对所有的字段进行校验过滤,在这种场景下列式存储需要花费比行式存储更多的资源,因为行式存储读取一条数据只需要一次I/O操作,而列式存储则需要花费多次,列数越多消耗的I/O资源越多。

ORC的行列式存储结构结合了行式和列式存储的优点,在有大数据量扫描读取时,可以按行组进行数据读取。如果要读取某个列的数据,则可以在读取行组的基础上,读取指定的列,而不需要读取行组内所有行的数据及一行内所有字段的数据。

ORC文件结构由三部分组成:

1、条带(stripe):ORC文件存储数据的地方,结构同样可以分为三部分:

        1)index data:保存了所在条带的一些统计信息,以及数据在stripe中的位置索引信息。

        2)rows data:数据存储的地方,由多个行组构成,数据以流(stream)的形式进行存储。存储两部分的数据,即metadata streamdata stream

                a、metadata stream:用于描述每个行组的元数据信息。

                b、data stream:存储数据的地方。

        3)stripe footer:保存数据所在的文件目录。

2、文件脚注(file footer):包含了文件中stripe的列表,每个stripe的行数,以及每个列的数据类型。它还包含每个列的最小值、最大值、行计数、求和等聚合信息。

3、postscript:含有压缩参数和压缩大小相关的信息。

简要了解完ORC的结构可以得知,ORC在每个文件中提供了3个级别的索引。

1、文件级:这一级的索引信息记录文件中所有stripe的位置信息,以及文件中所存储的每列数据的统计信息。

2、条带级别:该级别索引记录每个stripe所存储数据的统计信息。

3、行组级别:在stripe中,每10 000行构成一个行组,该级别的索引信息就是记录这个行组中存储的数据的统计信息。

程序可以借助ORC提供的索引加快数据查找和读取效率。程序在查询ORC文件类型的表时,会先读取每一列的索引信息,将查找数据的条件和索引信息进行对比,找到满足查找条件的文件。接着根据文件中的索引信息,找到存储对应的查询条件数据stripe,再借助stripe的索引信息读文件中满足查询条件的所有stripe块。之后再根据stripe中每个行组的索引信息和查询条件比对的结果,找到满足要求的行组

2.2.2、ORC的数据类型

Hive在使用ORC文件进行存储数据时,描述这些数据的字段信息、字段类型信息及编码等相关信息都是和ORC中存储的数据放在一起的。ORC中每个块中的数据都是自描述的,不依赖外部的数据,也不存储在Hive的元数据库中。ORC提供的数据数据类型包含如下内容:

1、整型:包含boolean(1bit)、tinyint(8bit)、smallint(16bit)、int(32bit)、bigint(64bit)。

2、浮点型:包含float、double、decimal。

3、字符串类型:包含string、char、varchar。

4、二进制类型:包含binary。

5、日期和时间类型:包含timestamp和date。

6、复杂类型:包含struct、list、map和union类型。

目前ORC基本已经兼容了日常所能用到的绝大部分的字段类型。另外,ORC中所有的类型都可以接受NULL值。

Hive在创建ORC类型的表时,表中的列是按照struct形式组织,struct是按照树的方式来组织并描述字段的。例如:

create table test(
a int
b map<string,struct<myString : string,myDouble: double>>,
c string
)

2.2.3、ORC的压缩格式

ORC存储格式支持的压缩格式有限:None(不压缩),Zlib和Snappy三种压缩格式。默认为Zlib压缩,不支持切分。

1、Zlib

无损压缩算法,提供了较高的压缩比。它通常用于需要较高压缩率的场景,但压缩和解压缩速度相对较慢。适用于对压缩率有较高要求且可以容忍一定延迟的场景

2、Snappy

以较快的压缩和解压缩速度著称,但压缩比通常低于ZLIB。适用于需要频繁读写操作的数据处理任务,特别是在读取性能至关重要的分析型工作负载中

2.2.3、ORC存储格式建表

CREATE TABLE IF NOT EXISTS orc_table (id INT,name STRING,value DOUBLE
)
STORED AS ORC;

2.3、Apache Parquet

Parquet是另外的一种高性能行列式的存储结构,可以适用多种计算框架,被多种查询引擎所支持,包括HiveImpalaDrill等。

2.3.1、Parquet基本结构

在一个Parquet类型的Hive表文件中,数据被分成多个行组,每个列块又被拆分成若干的页(Page),如图下图所示。

Parquet在存储数据时,也同ORC一样记录这些数据的元数据,这些元数据也同Parquet的文件结构一样,被分成多层文件级别的元数据、列块级别的元数据及页级别的元数据。

程序可以借助Parquet的这些元数据,在读取数据时过滤掉不需要读取的大部分文件数据,加快程序的运行速度。同ORC的元数据一样,Parquet 的这些元数据信息能够帮助提升程序的运行速度,但是ORC在读取数据时又做了一定的优化,增强了数据的读取效率。下面用两个例子来看看程序在读取ParquetORC文件时的差别。

2.3.2、Parquet的压缩格式

Parquet存储格式支持的压缩格式:Uncompress(不压缩)、Zlib、LZO、Snappy、Gzip。默认为不压缩。

1、Snappy

以较快的压缩和解压缩速度著称,但压缩比通常低于ZLIB。适用于需要频繁读写操作的数据处理任务,特别是在读取性能至关重要的分析型工作负载中

2、Zlib

无损压缩算法,提供了较高的压缩比。它通常用于需要较高压缩率的场景,但压缩和解压缩速度相对较慢。适用于对压缩率有较高要求且可以容忍一定延迟的场景。

3、LZO

通常用于需要快速读取和写入数据的场景。LZO提供了适中的压缩比和速度,但可能需要额外的解压缩库支持。适用于需要处理大文件且希望避免数据倾斜的场景,因为LZO压缩的文件可以更容易地进行分割和并行处理

4、Gzip

一种广泛使用的无损压缩算法,提供了较高的压缩比。然而,其压缩和解压缩速度相对较慢,可能会在处理大量数据时引入延迟。适用于存储空间有限且对压缩率有较高要求的场景,但需要注意其可能对查询性能产生的影响

2.3.3、Parquet存储格式建表

CREATE TABLE my_parquet_table (id INT,name STRING,value DOUBLE
)
STORED AS PARQUET;

三、ORC与Parquet的使用

在Hive的性能比较中,同样的数据进行sql查询,使用ORC读取的行远小于Parquet,ORC的效率比较高。

实际生产中,使用Parquet存储格式,LZO压缩的方式更为常见,这种情况可以避免由于读取不可切分大文件导致的数据倾斜。如果数据并不是特别大的情况系啊,使用ORC存储格式,Snappy压缩效率还是非常好的

PS:有问题,欢迎大家指正讨论

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

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

相关文章

【云原生】云原生后端:网络架构详解

目录 引言一、微服务间的通信1.1 通信方式概览1.2 HTTP/REST1.3 gRPC1.4 消息队列1.5 GraphQL 二、API网关2.1 API网关架构示例2.2 API网关实现示例 三、服务发现3.1 服务发现实现示例3.2 服务发现的优势 四、网络安全4.1 网络安全最佳实践4.2 网络安全架构示例 总结参考资料 引…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机&#xff0c;无法搜索附近蓝牙设备 具体型号当时忘记查看了&#xff0c;如果你遇到有以下选项&#xff0c;记得打开~ 设置权限

华为自研仓颉编程语言官网上线 首个公测版本开放下载

仓颉编程语言官网正式公开上线&#xff0c;同时首个公测版本开放下载。本次仓颉编程语言官网上线了首页、在线体验、文档、学习、下载、动态以及三方库共六个模块&#xff0c;可供开发和学习和体验。 据悉&#xff0c;仓颉编程语言是在今年6月的华为开发者大会上正式公布&…

【AI换脸整合包及教程】AI换脸技术新贵:Rope换脸工具全面解析

随着人工智能技术的快速发展&#xff0c;AI换脸技术逐渐走入大众视野&#xff0c;成为一种既有趣又实用的技术。从早期的DeepFace到后来的Faceswap&#xff0c;再到如今的Rope&#xff0c;每一次技术的革新都带来了更高效、更自然的换脸体验。Rope作为当前市场上最炙手可热的AI…

Ubuntu Linux

起源与背景 Ubuntu起源于南非&#xff0c;其名称“Ubuntu”来源于非洲南部祖鲁语或豪萨语&#xff0c;意为“人性”、“我的存在是因为大家的存在”&#xff0c;这体现了非洲传统的一种价值观。Ubuntu由南非计算机科学家马克沙特尔沃斯&#xff08;Mark Shuttleworth&#xff…

angular实现dialog弹窗

说明&#xff1a; angular实现dialog弹窗 效果图&#xff1a; step1&#xff1a;E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.html <button mat-button (click)"openDialog()">Open dialog</button>step2&#xff1a;E:\projectgo…

《JVM第4课》程序计数器

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java程序计数器&#xff08;Program Counter Register&#xff09;是Java虚拟机&#xff08;JVM&#xff09;运行数据区的一个组成部分。每个线程都有它自己的程序计数器&#xff0c;这部分内存用于存储该线程下一条要执行的…

闪存学习_1:Flash-Aware Computing from Jihong Kim

闪存学习_1&#xff1a;Flash-Aware Computing from Jihong Kim 前言一、Storage Media&#xff1a;NAND Flash Memory1、概念2、编程和擦除操作3、读操作4、异地更新操作&#xff08;Out-Place Update&#xff09;5、数据可靠性6、闪存控制器&#xff08;SSD主控&#xff09;7…

嵌入式web开发:boa、lighttpd

嵌入式web开发&#xff1a;boa、lighttpd https://blog.csdn.net/m0_37105371/category_10937068.html BOA服务器的移植-CSDN博客 【第1部分&#xff1a;boa服务器部署到ubuntu里】 http://www.boa.org/boa-0.94.13.tar.gz tar xvzf boa-0.94.13.tar.gz cd boa-0.94.13/src/ a…

使用模板工厂模式实现动态创建C++对象

一、前言 在现代C开发中&#xff0c;工厂模式是常见的设计模式之一&#xff0c;能够有效地解耦对象创建与使用代码。本文介绍一个模板类 ComponentsFactory&#xff0c;它运用了模板编程和工厂模式&#xff0c;实现了一种动态的对象创建方式。通过该工厂&#xff0c;我们可以基…

Linux_04 Linux常用命令——tar

一、命令格式 tar [选项] [归档文件] [要处理的文件或目录]1、选项 c创建归档文件x解压缩归档文件z使用gzipj使用bzip2v处理过程显示信息f指定归档文件名称 2、归档文件-可指定目录及文件名 /home/wang.tar.gz 3、要处理的文件或目录 /home/study1/wang 二、常见命令 t…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第一天

24.10.31 开发前准备 IDE下载与配置GitHub仓库创建 IDE下载与配置 下载最新版本IDEA&#xff0c;卸载之前的旧版本 后面一路跟着安装的默认选项走即可 安装完以后这个最新的可以把我再jetbrains的其他软件设置导入&#xff0c;很方便 接下来创建新的项目并进行安卓应用开发…

【elkb】索引生命周期管理

索引生命周期管理 Index lifecycle management(索引生命周期管理)是elasticsearch提供的一种用于自动管理索引的生命周期的功能。允许使用者定义索引的各个阶段&#xff0c;从创建至删除。并允许使用者在每个阶段定义索引需要执行的特定动作。这些动作包含索引创建&#xff0c…

HttpServer模块 --- 封装TcpServer支持Http协议

目录 模块设计思想 模块代码实现 模块设计思想 本模块就是设计一个HttpServer模块&#xff0c;提供便携的搭建http协议的服务器的方法。 那么这个模块需要如何设计呢&#xff1f; 这还需要从Http请求说起。 首先http请求是分为静态资源请求和功能性请求的。 静态资源请求…

外接数据库给streamlit等web APP带来的变化

之前我采用sreamlit制作了一个调查问卷的APP&#xff0c; 又使用MongoDB作为外部数据存储&#xff0c;隐约觉得外部数据库对于web APP具有多方面的意义&#xff0c;代表了web APP发展的趋势之一&#xff0c;似乎是作为对这种趋势的响应&#xff0c;streamlit官方近期开发了st.c…

sql题库中常见问答

一.解答题 (15*2) 1 Drop, delete,truncates 三者的区别? ①、drop和truncate属于数据库的定义语言(DDL) ②、delete属于数据库的操作语言(DML) ③、drop可以删除全表结果,且删除的同时会删除表数据 ④、delete 和truncate只能删除表数据,truncate会删除表数据一起…

黄山谷捷IPO拟募资5亿元,增强核心竞争力

根据深交所发行上市审核进度&#xff0c;10月28日&#xff0c;黄山谷捷股份有限公司首发申请审核状态变更为“提交注册”。据悉&#xff0c;黄山谷捷本次拟公开发行不超过2,000万股&#xff0c;占本次发行后总股本的比例不低于25.00%。 招股书&#xff08;注册稿&#xff09;披…

无人机拦截捕获/直接摧毁算法详解!

一、无人机拦截捕获算法 网捕技术 原理&#xff1a;抛撒特殊设计的网具&#xff0c;捕获并固定无人机。 特点&#xff1a; 适用于小型无人机。 对无人机的损害较小&#xff0c;基本不影响其后续使用。 捕获成功率较高&#xff0c;且成本相对较低。 应用实例&#xff1a;…

.NET Core WebApi第4讲:控制器、路由

一、控制器是什么&#xff1f; 1、创建一个空的API控制器&#xff1a;TestController.cs 2、里面有一个类叫TestController&#xff0c;把它叫做控制器 因为它继承了ControllerBase类&#xff0c;ControllerBase类里提供了一系列的方法&#xff0c;使得TestController这个类具…

WAF+AI结合,雷池社区版的强大防守能力

网上攻击无处不不在&#xff0c;为了保护我自己的网站&#xff0c;搜索安装了一个开源免费的WAF 刚安装完成就收到了海外的攻击&#xff0c;看到是海外的自动化攻击工具做的 雷池刚好也有AI分析&#xff0c;于是就尝试使用这个功能&#xff0c;看看这个ai能力到底怎么样 以下…