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:有问题,欢迎大家指正讨论

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot的核心优势及其应用详解

目录 前言1. Spring Boot的核心优势1.1 启动依赖的集成1.2 自动化配置 2. 内嵌服务器支持2.1 内嵌Tomcat服务器2.2 独立运行与便捷部署 3. 外部配置管理3.1 多环境支持3.2 配置优先级与外部化配置 4. Spring Boot的应用场景4.1 微服务架构4.2 云原生应用 结语 前言 在现代的Ja…

scala---10.30

val、var package com_1030class Person {var name:String"rose"def sum(n1:Int,n2:Int):Int{n1n2} } object Person{def main(args: Array[String]): Unit {//创建person对象var personnew Person()println(person.sum(10,20))//30println(person.name)person.nam…

ubuntu22.04 docker-compose搭建apisix高可用

首先你得先确保每台主机安装了docker和docker-compose 3台主机 没有安装docker和docker-compose的可以看我前两篇博客 可以先克隆仓库 git clone https://github.com/apache/apisix-docker.git 进入example目录 拷贝dashboard配置文件 将all-in-one中apisix-dashboard文件夹拷…

北大计算机考研难度如何?毕业后就业情况怎么样?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 一、总体情况概述 北京大学计算机 2024 届考研整体呈现 “稳中有升” 的态势。在复试分数线方面&#xff0c;无论是学硕&#xff08;本部&#xff09;还是专硕&#xff08;深圳&#xff09;&#xff0c;较 2023 届均有…

黑马JavaWeb-day04

文章目录 mavenmaven 简介maven 安装IDEA集成maven创建maven项目Maven 坐标依赖管理单元测试 Web入门Springboot 入门HTTP协议三层架构分层解耦 I O C & D I IOC\&DI IOC&DI入门 I O C IOC IOC和 D I DI DI详解 maven maven 简介 maven: M a v e n Maven Maven是…

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…

品牌怎么找到用户发的优质内容,进行加热、复制?

在&#xff0c;相对传统媒体来说&#xff0c;社交媒体营销具有更高的成本效益。品牌可以通过相对较低的成本达到大量潜在客户&#xff0c;尤其是通过口碑营销和内容分享&#xff0c;可以实现倍增的传播效果。在社媒营销的过程中&#xff0c;去找到与品牌有关的优质、正向内容&a…

梁山派入门指南3——串口使用详解,包括串口发送数据、重定向、中断接收不定长数据、DMA+串口接收不定长数据,以及对应的bsp文件和使用示例

梁山派入门指南3——串口使用详解&#xff0c;包括串口发送数据、重定向、中断接收不定长数据、DMA串口接收不定长数据&#xff0c;以及对应的bsp文件和使用示例 1. 串口发送数据1.1 串口简介1.2 梁山派上的串口开发1.3 bsp_uart文件&#xff08;只发送不接收&#xff0c;兼容串…

notepad++ compare插件的离线下载和安装

一、离线安装 去改地址找到最新的插件&#xff1a;https://github.com/notepad-plus-plus/nppPluginList/blob/master/doc/plugin_list_x64.md下载之后复制到插件文件夹&#xff0c;插件文件夹的打开方式如下 注意目录&#xff1a; 二、问题汇总 &#xff08;1&#xff09…

你的网站需要防护吗?

你的网站经常被恶意爬虫&#xff0c;重要数据被批量搬运吗&#xff1f; 你想知道你的网站是不是安全的&#xff0c;有没有被 xss攻击、sql注入、命令注入等等这些乱七八糟的攻击手段攻击吗&#xff1f; 2014年我还是学生的时候&#xff0c;负责学院官网的维护&#xff0c;一…

在postman设置请求里带动态token,看看这两种方法!

问题描述 在使用postman调试接口时&#xff0c;遇到一些需要在请求里加上token的接口&#xff0c;若token出现变化&#xff0c;需要手动修改接口的token值&#xff0c;带来重复的工作量&#xff0c;翻看postman使用手册后&#xff0c;我发现了两种方法可以解决这个问题。 01 …

商家如何在高德地图上申请店铺入驻?

在当今数字化时代&#xff0c;互联网成为了消费者寻找商品和服务的主要渠道。高德地图作为国内领先的地图导航软件&#xff0c;不仅拥有庞大的用户基础&#xff0c;还为商家提供了优质的店铺展示平台。因此&#xff0c;对于实体店商家而言&#xff0c;入驻高德地图是提升店铺曝…

Java并发常见面试题总结(下)

Map&#xff08;重要&#xff09; HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMa…

数字化导师坚鹏:2025年银行开门红营销规划、方法及案例工作坊

2025年银行开门红营销规划、方法及案例工作坊 ——数字化赋能 新策略启航 开门红必胜 课程背景&#xff1a; 面对即将打响的开门红战役&#xff0c;很多银行存在以下问题&#xff1a; 不知道如何分析银行开门红面临形势及机遇&#xff1f; 不知道如何制定科学高效的开…

普通的Java程序员,需要深究源码吗?

作为Java开发者&#xff0c;面试肯定被问过多线程。对于它&#xff0c;大多数好兄弟面试前都是看看八股文背背面试题以为就OK了&#xff1b;殊不知现在的面试官都是针对一个点往深了问&#xff0c;你要是不懂其中原理&#xff0c;面试就挂了。可能你知道什么是进程什么是线程&a…

ctfshow——web(总结持续更新)

文章目录 1、基础知识部分2、php伪协议2.1 php://input协议2.2 data://text/plain协议 3、webshell连接工具3.1 蚁剑连接一句话木马 4、各个web中间件重要文件路径4.1 Nginx 5、sqlmap使用6、php特性6.1 md5加密漏洞 7、TOP 10漏洞7.1 SQL注入 1、基础知识部分 识别base64编码…

MYSQL---TEST5(Trigger触发器综合练习)

触发器Trigger 数据库mydb16_trigger创建 表的创建 goods create table goods( gid char(8) primary key, #商品号 name varchar(10), #商品名 price decimal(8,2), #价格 num int&#xff1b;&#xff09; #数量orders create tabl…

layui 自定义验证单选框必填

对于输入框类型必填验证&#xff0c;只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢&#xff1f;layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…

OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143432922 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

「C/C++」C/C++标准库 之 #include<ctime> 时间日期库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…