在Hive测试中为何Parquet/SequenceFile占用空间远超原TXT?
问题解答
核心原因是所有数据格式均未启用压缩,结合不同格式的存储结构特性,最终导致体积出现差异:
1. ORC格式体积小于原TXT的原因
ORC即使未开启压缩(compressed:false),本身也自带轻量级列式编码优化(如字典编码、行程编码、位编码等),能有效消除纯文本中的冗余信息(比如重复字符串的明文存储、分隔符的额外占用),所以169MB的TXT转成ORC后体积降到130MB。
2. Parquet格式体积大于原TXT的原因
Parquet是列式存储格式,若未开启压缩,其存储结构会引入额外的元数据开销:
- 每个列会被分成多个数据页,每个页都包含页头、索引信息;
- 若数据本身重复度较低,Parquet默认的编码优化效果有限,额外的结构开销会超过编码带来的空间节省;
- 从ORC转Parquet的过程未做针对性优化,ORC的编码逻辑无法被Parquet复用,进一步放大了结构开销,最终导致体积达到423MB。
3. SequenceFile格式体积暴增的原因
SequenceFile是基于键值对的二进制存储格式,每条记录都需要存储键和值的长度、类型标识等元数据,相当于给每条纯文本记录套了一层二进制包装。未开启压缩时,这些额外的元数据和包装会让体积大幅膨胀,最终达到1.87GB,远大于原TXT。
启用压缩后的优化建议
若要让Parquet、SequenceFile体现压缩优势,需在创建表时显式指定压缩配置:
- Parquet:
CREATE TABLE parquet_table (...) STORED AS PARQUET TBLPROPERTIES ("parquet.compression"="SNAPPY");
- SequenceFile:
CREATE TABLE seq_table (...) STORED AS SEQUENCEFILE TBLPROPERTIES ( "mapreduce.output.fileoutputformat.compress"="true", "mapreduce.output.fileoutputformat.compress.codec"="org.apache.hadoop.io.compress.SnappyCodec" );
- ORC(可选进一步压缩):
CREATE TABLE orc_table (...) STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY");
内容的提问来源于stack exchange,提问作者fei yang
相关产品推荐
相关产品推荐

