Hive的Parquet存储与LZO压缩

在Hive中,为我们提供了五种文件存储格式

  • 1、Textfile
  • 2、Sequencefile
  • 3、Rcfile
  • 4、Orcfile
  • 5、Parquet
    这里主要介绍一下Parquet,列式存储
一、概念

1、Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Mapreduce、Spark等),被多种查询引擎支持(Hive、Impala、Drill等),并且它是语言和平台无关的。Parquet最初是由Twitter和Cloudera合作开发完成并开源,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。
2、Parquet 配合的组件
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
数据模型: Avro, Thrift, Protocol Buffers, POJOs
3、Parquet最初的灵感来自Google于2010年发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的。
4、Parquet文件是以二进制方式存储的,所以不可以直接读取,和ORC一样,文件的元数据和数据一起存储,所以Parquet格式文件是自解析的

二、Parquet数据模型

在这里插入图片描述
上图展示了一个Parquet文件的内容,一个文件中可以存储多个行组,文件的首位都是该文件的Magic Code,用于校验它是否是一个Parquet文件,Footer length记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据,在Parquet中,有三种类型的页:数据页、字典页和索引页。数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典,每一个列块中最多包含一个字典页,索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页。

Parquet文件在磁盘所有数据分成多个RowGroup 和 Footer。
1、RowGroup(行组): 真正存储数据区域,每一个RowGroup存储至少一个ColumnChunk的数据。
2、ColumnChunk(列块):在一个行组中,每一列的数据保存在一个列块中(就代表当前RowGroup某一列的数据),并且一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。ColumnChunk至少包含一个Page。
3、Page(页):是压缩和编码的最小单元,每一个列块划分为多个页,主要包括PageHeader,RepetitionLevel,DefinitionLevel和Values.
4、PageHeader: 包含一些元数据,诸如编码和压缩类型,有多少数据,当前page第一个数据的偏移量,当前Page第一个索引的偏移量,压缩和解压的大小
5、DefinitionLevel: 当前字段在路径中的深度
6、RepetitionLevel: 当前字段是否可以重复
7、Footer:主要当前文件的元数据和一些统计信息

三、Parquet的表配置属性
  • parquet. block size:默认值为134217728byte,即128MB,表示 Row Group在内存中的块大小。该值设置得大,可以提升 Parquet文件的读取效率,但是相应在写的时候需要耗费更多的内存
  • parquet. page:size:默认值为1048576byt,即1MB,表示每个页(page)的大小。这个特指压缩后的页大小,在读取时会先将页的数据进行解压。页是 Parquet操作数据的最小单位,每次读取时必须读完一整页的数据才能访问数据。这个值如果设置得过小,会导致压缩时出现性能问题
  • parquet. compression:默认值为 UNCOMPRESSED,表示页的压缩方式。「可以使用的压缩方式有 UNCOMPRESSED、 SNAPPY、GZP和LZO」。
  • Parquet enable. dictionary:默认为tue,表示是否启用字典编码。
  • parquet. dictionary page.size:默认值为1048576byte,即1MB。在使用字典编码时,会在 Parquet的每行每列中创建一个字典页。使用字典编码,如果存储的数据页中重复的数据较多,能够起到一个很好的压缩效果,也能减少每个页在内存的占用。
四、压缩方式

1、Parquet格式存储,Lzo压缩

create table stu_par(id int,name string)
stored as parquet 
tblproperties ('parquet.compression'='lzo');

2、Parquet格式存储,Snappy压缩

create table stu_par(id int,name string)
stored as parquet 
tblproperties ('parquet.compression'='snappy');

在实际生产中,使用Parquet存储,lzo压缩的方式更为常见,这种情况下可以避免由于读取不可分割大文件引发的数据倾斜。 但是,如果数据量并不大(预测不会有超大文件,若干G以上)的情况下,使用ORC存储,snappy压缩的效率还是非常高的。

五、压缩对比

从存储文件的压缩比和查询速度两个角度对比。
压缩比例:ORC > Parquet > textFile
查询速度:查询速度相近

创建hive表,使用parquet格式存储数据
不可以将txt数据直接加载到parquet的表里面,需要创建临时的txt存储格式的表
1、创建测试数据表

CREATE TABLE emp_txt (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)
partitioned BY(dt string,hour string)
row format delimited fields terminated by ",";

2、创建表,存储数据格式为parquet

create table log_parquet(

id string,

line string

)

row format delimited fields terminated by '\t'

stored as parquet ;

3、向表中加载数据

hive (default)> insert into table log_parquet select * from emp_txt ;
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值