当前位置: 首页 > news >正文

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

相关文章:

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式&#xff08;TextFile&#xff09; 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件&#xff08;ORCFile&#xff09; 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…...

Linux Rsyslog 配置

1、Linux Rsyslog客户端配置 1&#xff09;安装rsyslog yum install rsyslog 2&#xff09;启用TCP或UDP传输 vim /etc/rsyslog.conf# Provides UDP syslog reception #若启用UDP进行传输&#xff0c;则取消下面两行的注释 #$ModLoad imudp #$UDPServerRun 514# Provide…...

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦&#xff0c;提前祝大家新年快乐 完整代码下载地址&#xff1a;https://download.csdn.net/download/ture_mydream/89926458...

模型训练识别手写数字(二)

模型训练识别手写数字&#xff08;一&#xff09;使用手写数字图像进行模型测试 一、生成手写数字图像 1. 导入所需库 import cv2 import numpy as np import oscv2用于计算机视觉操作。 numpy用于处理数组和图像数据。 os用于文件和目录操作。 2. 初始化画布 canvas np.z…...

深入Vue2

frontend Vue2 学习内容参考 /在线运行 Element 学习内容参考 /视频教学 vue2 1. vue 实例 当一个 Vue 实例被创建时&#xff0c;它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中 但是当使用Object.freeze()&#xff0c;会阻止修改现有的 property&#x…...

opencv-rust 系列3: Create_mask

前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 调试方法可参见前文. 一. 这个程序还是有点难度的, 关键点在于: 创建了遮罩. 直接调用一个函数, 还是很简单的.窗口事件处理. 注册窗口回调函数, 用以处理鼠标事件进程同步和互斥锁. 为…...

Go语言初识

一、Go语言概述 Go语言是为了取代C和java的地位&#xff0c;既要保留C的简洁&#xff0c;也追求java的规模化开发 并行及分布式的支持&#xff0c;使得开发多核及多机器集群程序如同单机一样简单 Go语言从语言级别支持协程&#xff08;goroutine, 轻量级线程&#xff09;,Go语言…...

Android Activity SingleTop启动模式使用场景

通知栏 当用户点击通知栏中的通知时,可以使用单顶启动模式来打开对应的活动,并确保只有一个实例存在。 简单集成极光推送 创建应用 获取appkey参数 切换到极光工作台 极光sdk集成 Project 根目录的主 gradle 配置 Module 的 gradle 配置 Jpush依赖配置 配置推送必须…...

PHP 代码执行相关函数

函数 说明 示例代码 ${} 用于复杂的变量解析&#xff0c;通常在字符串内用来解析变量或表达式。可以配合 eval 或其他动态执行代码的功能&#xff0c;用于间接执行代码。 eval(${flag}); eval() 用于执行一个字符串作为 PHP 代码。可以执行任何有效的 PHP 代码片段。没有…...

五周年,继续破浪前行

五周年&#xff0c;TapData 再一次带着自己的“乘风破浪”大队&#xff0c;在一个阳光明媚的日子里&#xff0c;把生日过在了海上。 头顶日升日落&#xff0c;这条属于全体 Tap-pers 的航船&#xff0c;再次校准航向&#xff0c;在船长的带领下&#xff0c;驶向下一个晴好的明…...

【操作系统】Linux之进程管理一

第1关&#xff1a;获取进程常见属性 ret.pidgetpid(); ret.ppidgetppid(); 第2关&#xff1a;进程创建操作-fork pid_t pid fork(); if(pid-1) printf("创建进程失败&#xff01;"); else if(pid0) printf("Children"); else printf("Parent"); …...

C语言_数据在内存中的存储

1. 整数在内存中的存储 计算机中的整数有三种2进制表示方法 &#xff1a;原码、反码、补码。 三种表示方式均有符号位和数值位两个部分&#xff0c;最高一位的是符号位&#xff0c;剩下的都是数值位。符号位用“0”表示“正”&#xff0c;用“1”表示“负”。 正数的原、反、…...

华为原生鸿蒙操作系统:我国移动操作系统的新篇章

华为原生鸿蒙操作系统&#xff1a;我国移动操作系统的新篇章 引言 在移动操作系统领域&#xff0c;苹果iOS和安卓系统一直占据主导地位。然而&#xff0c;随着华为原生鸿蒙操作系统的正式发布&#xff0c;这一格局正在发生深刻变化。作为继苹果iOS和安卓系统后的全球第三大移动…...

队列的基本操作(数据结构)

1.实验内容&#xff1a; 编写一个程序sqqueue.cpp&#xff0c;实现环形队列(假设栈中元素类型ElemType 为 char)的各种基本运算&#xff0c;并在此基础上设计一个程序exp4_1.cpp&#xff0c;完成如下功能: 2.实验步骤&#xff1a; (1)初始化队列q (2)判断队列q是否非空 (3…...

linux开机自启动三种方式

方式一、 1&#xff1a;rc.local 文件 1、执行命令&#xff1a;编辑 “/etc/rc.local” vi /ect/rc.local 2、然后在文件最后一行添加要执行程序的全路径。 例如&#xff0c;每次开机时要执行一个 hello.sh&#xff0c;这个脚本放在 / usr 下面&#xff0c;那就可以在 “/et…...

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…...

FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)

前言 在FPGA设计中&#xff0c;Xilinx Vivado软件是一款功能强大的设计工具&#xff0c;它不仅支持硬件描述语言&#xff08;HDL&#xff09;的开发&#xff0c;还提供了丰富的图形化设计界面&#xff0c;方便用户进行硬件设计、调试和测试。这里我们将详细介绍&#xff0c;如…...

Kafka文档阅读笔记之基本操作

官方资料 官方首页官方文档基本操作topic的配置参数 topic的部分操作 创建新的topic 命令样例&#xff0c;如下&#xff1a; bin/kafka-topics.sh \--bootstrap-server localhost:9092 \--create \--topic my_topic_name \--partitions 20 \--replication-factor 3 \--conf…...

Golang | Leetcode Golang题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; var desc [3]string{"Gold Medal", "Silver Medal", "Bronze Medal"}func findRelativeRanks(score []int) []string {n : len(score)type pair struct{ score, idx int }arr : make([]pair, n)for i, s : …...

机器学习——元学习(Meta-learning)

元学习&#xff08;Meta-learning&#xff09;&#xff1a;学习如何学习的机器学习 元学习&#xff08;Meta-learning&#xff09;&#xff0c;即“学习如何学习”&#xff0c;是机器学习领域中一个令人兴奋且极具潜力的研究方向。它的核心目标是让机器学习系统学会高效地学习…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...