HIVE基础-文件存储格式

Hive的文件存储格式

文件主要存储格式有四种:textfile、sequencefile、orc、parquet

在Hive建表的时候可以指定文件存储格式,具体可见:HIVE操作语句–DDL篇

CREATE TABLE table_name(
    ······
)
SORTED AS file_format

file_format代表文件格式;
常用的文件格式:textfile(文本)、sequencefile(二进制序列文件)、rcfile(列式存储)

前提:行式存储以及列式存储
行式存储

行存储中的数据是按照数据行为基础逻辑单元进行存储,一行中的数据在存储介质中以连续的形式存在。行存储时将表格看作一个一个的记录,优势是更新块,数据集中数据都是单条记录,适合事务。

列式存储

列存储的数据时按照列为基础逻辑存储单元进行存储,一列中的数据在存储介质中以连续存储形式存在。列存储将表中数据一列一列的存储在一起,优势是便于查找,以及进行聚合运算。

texfile 和 sequencefile 是行式存储
orc 和 parquet 是列式存储

一、TextFile 格式

默认文件存储格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合 Gzip、Bzip2 使用,进行数据的压缩,但是使用Gzip的时候,数据不能进行切分。

二、Orc 格式

每个Orc文件是由1个或者多个stripe组成,每个stripe一般为HDFS的块大小,每个stripe包含多条记录,记录按照列进行独立存储。每个stripe由三部分组成,分别是 Index Data, Row Data, Stripe Footer。

HIVE基础-文件存储格式

Index Data:一个轻量级的索引,默认每隔1W行做一个索引,记录某行的各字段在Row Data中的offset;
Row Data:存储的是具体的数据,先取数据中部分行,将行按列进行存储。并对每个列进行了编码,分成多个Stream存储;
Stripe Footer:存储的是各个Stream的类型,长度等信息。

在文件存储的时候,每个文件都有一个File Footer,记录着每个Stripe的行数,以及每个行的数据类型;每个数据文件存储的尾部有一个Post Script,记录了数据文件的压缩类型,以及File Footer的长度信息。

读取文件时,先从文件尾部读取Post Script,解析到File Footer的长度,再读File Footer,解析到每个Stripe信息,获取到每个Stream的信息,随后通过Stream,以及Index进行读取数据。

; 三、Parquet 格式

文件是以二进制方法存储,不能直接读取文件,文件中包括该文件的数据以及元数据。

HIVE基础-文件存储格式

Row Group:行组,每一个行组包含一定的行数,并且在一个HDFS文件中最少存储一个行组;
Column Chunk:列块,在一个行组中每一列保存在一个列块中,行组中的所有块连续存储在行组文件中。一个列块中的值都是相同类型,不同的列块可以使用不同的算法进行压缩;
Page:页,每一个列块划分为多个页,一个页是最小的编码单位,在同一个列块的不同页,可能使用不同的编码方式。

一个Parquet文件可以存储多个行组,文件的首位都是该文件的 Magic Code,用于校验该文件是否是一个Parquet文件,Footer length 记录了文件的元数据的大小,通过该值和文件的长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema信息。除了文件中的每一个行组的元数据,每一页的开始都会存储该页的元数据。

column chunk a meta data中保存着该列块元数据,包括字段类型,数据个数,起始位置偏移量等。

在文件中,包括三种类型的页:数据页、字典页和索引页。

数据页用于存储当前行组中该列的值;字典页存储该列值的编码字典,每一个列块中最多包含一个字典页;索引页用来存储当前行组下该列的索引,但在Parquet中不支持索引页。

Original: https://blog.csdn.net/weixin_43935266/article/details/127679819
Author: 小猿天地
Title: HIVE基础-文件存储格式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817957/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球