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。
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 格式
文件是以二进制方法存储,不能直接读取文件,文件中包括该文件的数据以及元数据。
Row Group:行组,每一个行组包含一定的行数,并且在一个HDFS文件中最少存储一个行组;
Column Chunk:列块,在一个行组中每一列保存在一个列块中,行组中的所有块连续存储在行组文件中。一个列块中的值都是相同类型,不同的列块可以使用不同的算法进行压缩;
Page:页,每一个列块划分为多个页,一个页是最小的编码单位,在同一个列块的不同页,可能使用不同的编码方式。
一个Parquet文件可以存储多个行组,文件的首位都是该文件的 Magic Code,用于校验该文件是否是一个Parquet文件,Footer length 记录了文件的元数据的大小,通过该值和文件的长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema信息。除了文件中的每一个行组的元数据,每一页的开始都会存储该页的元数据。
column chunk a meta data中保存着该列块元数据,包括字段类型,数据个数,起始位置偏移量等。
在文件中,包括三种类型的页:数据页、字典页和索引页。文章来源:https://www.toymoban.com/news/detail-514380.html
数据页用于存储当前行组中该列的值;字典页存储该列值的编码字典,每一个列块中最多包含一个字典页;索引页用来存储当前行组下该列的索引,但在Parquet中不支持索引页。文章来源地址https://www.toymoban.com/news/detail-514380.html
到了这里,关于HIVE基础-文件存储格式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!