Hive文件存储格式

发布时间 2024-01-08 17:08:20作者: 粒子先生

结论:

Text File,Parquet ,ORC Files结合使用,优先使用前两种,对存储及查询性能有极高要求时使用ORC。

存储格式
使用场景
Text File 数据直观,便于查看和编辑,数据量较小的维表可以使用.
Parquet 

支持深度嵌套,可用于多种数据处理框架(Hive/Spark/Flink/MapReduce/Impala/Presto等),Flink1.9版本已经支持此数据结构(已验证),能解决Hive行分隔符(默认\n)不能替换问题。

适用于字段数较多的宽表。

ORC Files 存储及查询效率最好,Flink1.11版本之后才有支持,目前只能自己实现ORC Writer。

 

压缩格式一般使用snappy或lzo,使用压缩节省磁盘并检索IO占用情况,但会增加CPU消耗(性能情况需要实际数据情况验证),前期数据量不多时可以先不开启。

File Formats

Hive supports several file formats:

 

格式
描述
Text File 每一行都是一条记录,每行都以换行符(\ n)结尾。数据不做压缩,磁盘开销大,数据解析开销大。
SequenceFile 是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。 
RCFile 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。 
Avro Files 为Hadoop提供数据序列化和数据交换服务。您可以在Hadoop生态系统和以任何编程语言编写的程序之间交换数据。
ORC Files ORC文件代表了优化排柱状的文件格式。ORC文件格式提供了一种将数据存储在Hive表中的高效方法。这个文件系统实际上是为了克服其他Hive文件格式的限制而设计的。Hive从大型表读取,写入和处理数据时,使用ORC文件可以提高性能。
Parquet Parquet是一个面向列的二进制文件格式。Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列的查询,Parquet特别有用。Parquet桌子使用压缩Snappy,gzip;目前Snappy默认。
Custom INPUTFORMAT and OUTPUTFORMAT 暂不调研

 

格式
存储方式
业内使用情况
优缺点及使用场景
Text File 行存储 常用 数据直观,便于查看和编辑,数据量较小的维表可以使用。
SequenceFile 行存储 几乎不用 k-v格式,比源文本格式占用磁盘更多,对于Hadoop生态系统之外的工具不适用,需要通过text文件转化加载。
RCFile 行列混合存储 较少 加载时性能消耗较大,需要通过text文件转化加载;读取全量数据性能低。
Avro Files - 较少 数据传输交换时使用较多。
ORC Files 列存储 常用 优化后的rcfile,列式存储,有多种文件压缩方式,并且有着很高的压缩比,适用于Hive中大型的存储、查询。Flink1.11版本之后才有支持,目前只能自己实现ORC Writer。
Parquet 列存储 常用

高效的压缩和编码,支持深度嵌套,不与任何数据处理技术绑定,可用于多种数据处理框架(Hive/Spark/Flink/MapReduce/Impala/Presto等),适用于字段数较多的宽表进行部分列的查询。解决Hive行分隔符(默认\n)不能替换问题。

Custom INPUTFORMAT and OUTPUTFORMAT - 几乎不用  

注意:  一般来说Hive的默认行分隔符都是换行符,如果非要自定义行分隔符的话,可以通过自定义Inputformat和outputformat类来指定特定行分隔符和列分隔符。

行式存储和列式存储

 

行存储 

 列存储

                                                                                                          

存储方式
压缩比较
查询比较
行式存储 按照行压缩,由于一行中有多个字段,而且字段类型有可能不一样,所有压缩性能差 查询一张表中的某几个字段,由于是行式存储而进行全表扫描,查询慢。
列式存储 每一列对应的相同的数据格式,所以压缩性能好 查询一张表中的某几个字段,由于是列式存储不需要全表扫描查询快,但如果是select * from table 这种反之慢,因为列式存储查询出结果还要组装数据。

 

RCFile存储结构

ORC存储结构          

Parquet存储结构

 

性能测试

以下是网上搜集的性能测试结果,可供参考。

1.

测试数据大小:100G

测试Sql: select visitdate,count(*) as pv from 表名 where action = '1' and domain = 'static.scms.sztv.com.cn' group by visitdate order by pv;

测试环境:

存储格式
ORC
Sequencefile
Parquet
RCfile
Avro
压缩后大小 1.8G 67.0G 11G 63.8G 66.7G
存储耗费时间 535.7s 625.8s 537.3s 543.48s 544.3s
SQL查询响应速度 19.63s 184.07s 24.22s 88.5s 281.65s

2.

存储格式
Parquet
ORC
Text
数据大小 709M 275M 1G
查询速度 36.451 26.133 42.574


参考:

https://cwiki.apache.org/confluence/display/Hive/FileFormats

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

https://zhuanlan.zhihu.com/p/141908285

https://www.cnblogs.com/panpanwelcome/p/10248990.html

 

orcfile :  https://www.cnblogs.com/ITtangtang/p/7677912.html

parquet: https://www.cnblogs.com/ITtangtang/p/7681019.html

https://blog.csdn.net/zyzzxycj/article/details/79267635