Hive支持的文件格式与压缩算法
概述 只要是配置了正确的文件类型和压缩类型(比如Textfile+Gzip、SequenceFile+Snappy等),Hive都可以按预期读取并解析数据,提供SQL功能。 SequenceFile本身的结构已经设计了内容进行压缩。所以对于SequenceFile文件的压缩,并不是先生成SequenceFile文件,再对文件进行压缩。而是生成SequenceFile文件时,对其中的内容字段进行压缩。最终压缩后,对外仍体现为一个SequenceFile。 RCFile、ORCFile、Parquet、Avro对于压缩的处理方式与SequenceFile相同。 文件格式 Textfile SequenceFile RCFile ORCFile Parquet Avro 压缩算法的编解码器 TEXTFILE --创建一个表,格式为文本文件: CREATEEXTERNALTABLEstudent_text(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --导入数据到此表中,将启动MR任务 INSERTOVERWRITETABLEstudent_textSELECT*FROMstudent; 可查看到生成的数据文件的格式为非压缩的文本文件: hdfsdfs-cat/user/hive/warehouse/student_text/000000_0 1001810081,cheyo 1001810082,pku 1001810083,rocky 1001810084,stephen 2002820081,sql 2002820082,hello 2002820083,hijj 3001810081,hhhhhhh 3001810082,abbbbbb 文本文件,DEFLATE压缩 --创建一个表,格式为文件文件: CREATETABLEstudent_text_def(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置压缩类型为Gzip压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec; --导入数据: INSERTOVERWRITETABLEstudent_text_defSELECT*FROMstudent; --查看数据 SELECT*FROMstudent_text_def; 查看数据文件,可看到数据文件为多个.deflate文件。 hdfsdfs-ls/user/hive/warehouse/student_text_def/ -rw-r--r--2015-09-1612:48/user/hive/warehouse/student_text_def/000000_0.deflate -rw-r--r--2015-09-1612:48/user/hive/warehouse/student_text_def/000001_0.deflate -rw-r--r--2015-09-1612:48/user/hive/warehouse/student_text_def/000002_0.deflate 文本文件,Gzip压缩 --创建一个表,格式为文件文件: CREATETABLEstudent_text_gzip(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置压缩类型为Gzip压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --导入数据: INSERTOVERWRITETABLEstudent_text_gzipSELECT*FROMstudent; --查看数据 SELECT*FROMstudent_text_gzip; 查看数据文件,可看到数据文件为多个.gz文件。解开.gz文件,可以看到明文文本: hdfsdfs-ls/user/hive/warehouse/student_text_gzip/ -rw-r--r--2015-09-1510:03/user/hive/warehouse/student_text_gzip/000000_0.gz -rw-r--r--2015-09-1510:03/user/hive/warehouse/student_text_gzip/000001_0.gz -rw-r--r--2015-09-1510:03/user/hive/warehouse/student_text_gzip/000002_0.gz 文本文件,Bzip2压缩 --创建一个表,格式为文件文件: CREATETABLEstudent_text_bzip2(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置压缩类型为Bzip2压缩: SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec; --导入数据 INSERTOVERWRITETABLEstudent_text_bzip2SELECT*FROMstudent; --查看数据: SELECT*FROMstudent_text_bzip2; 查看数据文件,可看到数据文件为多个.bz2文件。解开.bz2文件,可以看到明文文本: hdfsdfs-ls/user/hive/warehouse/student_text_bzip2 -rw-r--r--2015-09-1510:09/user/hive/warehouse/student_text_bzip2/000000_0.bz2 -rw-r--r--2015-09-1510:09/user/hive/warehouse/student_text_bzip2/000001_0.bz2 -rw-r--r--2015-09-1510:09/user/hive/warehouse/student_text_bzip2/000002_0.bz2 文本文件,lzo压缩 --创建表 CREATETABLEstudent_text_lzo(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置为LZO压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec; --导入数据 INSERTOVERWRITETABLEstudent_text_lzoSELECT*FROMstudent; --查询数据 SELECT*FROMstudent_text_lzo; 查看数据文件,可看到数据文件为多个.lzo压缩。解开.lzo文件,可以看到明文文本。 未实测,需要安装lzop库 文本文件,lz4压缩 --创建表 CREATETABLEstudent_text_lz4(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置为LZ4压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec; --导入数据 INSERTOVERWRITETABLEstudent_text_lz4SELECT*FROMstudent; 查看数据文件,可看到数据文件为多个.lz4压缩。使用cat查看.lz4文件,可以看到是压缩后的文本。 hdfsdfs-ls/user/hive/warehouse/student_text_lz4 -rw-r--r--2015-09-1612:06/user/hive/warehouse/student_text_lz4/000000_0.lz4 -rw-r--r--2015-09-1612:06/user/hive/warehouse/student_text_lz4/000001_0.lz4 -rw-r--r--2015-09-1612:06/user/hive/warehouse/student_text_lz4/000002_0.lz4 文本文件,Snappy压缩 --创建表 CREATETABLEstudent_text_snappy(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASTEXTFILE; --设置压缩 SEThive.exec.compress.output=true; SETmapred.compress.map.output=true; SETmapred.output.compress=true; SETmapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; SETio.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec; --导入数据 INSERTOVERWRITETABLEstudent_text_snappySELECT*FROMstudent; --查询数据 SELECT*FROMstudent_text_snappy; 查看数据文件,可看到数据文件为多个.snappy压缩文件。使用cat查看.snappy文件,可以看到是压缩后的文本: hdfsdfs-ls/user/hive/warehouse/student_text_snappy Found3items -rw-r--r--2015-09-1516:42/user/hive/warehouse/student_text_snappy/000000_0.snappy -rw-r--r--2015-09-1516:42/user/hive/warehouse/student_text_snappy/000001_0.snappy -rw-r--r--2015-09-1516:42/user/hive/warehouse/student_text_snappy/000002_0.snappy SEQUENCEFILE Sequence文件,DEFLATE压缩 --创建一个表,格式为文件文件: CREATETABLEstudent_seq_def(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASSEQUENCEFILE; --设置压缩类型为Gzip压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec; --导入数据: INSERTOVERWRITETABLEstudent_seq_defSELECT*FROMstudent; --查看数据 SELECT*FROMstudent_seq_def; 查看数据文件,是一个密文的文件. hdfsdfs-ls/user/hive/warehouse/student_seq_def/ -rw-r--r--/user/hive/warehouse/student_seq_def/000000_0 Sequence文件,Gzip压缩 --创建一个表,格式为文件文件: CREATETABLEstudent_seq_gzip(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASSEQUENCEFILE; --设置压缩类型为Gzip压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --导入数据: INSERTOVERWRITETABLEstudent_seq_gzipSELECT*FROMstudent; --查看数据 SELECT*FROMstudent_seq_gzip; 查看数据文件,是一个密文的文件,无法通过gzip解压: hdfsdfs-ls/user/hive/warehouse/student_seq_gzip/ -rw-r--r--/user/hive/warehouse/student_seq_gzip/000000_0 RCFILE RCFILE,Gzip压缩 CREATETABLEstudent_rcfile_gzip(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASRCFILE; --设置压缩类型为Gzip压缩 SEThive.exec.compress.output=true; SETmapred.output.compress=true; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --导入数据: INSERTOVERWRITETABLEstudent_rcfile_gzipSELECTid,nameFROMstudent; --查看数据 SELECT*FROMstudent_rcfile_gzip; ORCFile ORCFile有自己的参数设置压缩格式,一般不使用上述Hive参数设置压缩参数。 ORCFile,ZLIB压缩 --创建表 CREATETABLEstudent_orcfile_zlib(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASORCFILETBLPROPERTIES("orc.compress"="ZLIB"); --导入数据 INSERTOVERWRITETABLEstudent_orcfile_zlibSELECTid,nameFROMstudent; --查询数据 SELECT*FROMstudent_orcfile_zlib; ORCFILE,Snappy压缩 --创建表 CREATETABLEstudent_orcfile_snappy2(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASORCFILETBLPROPERTIES("orc.compress"="SNAPPY"); --导入数据 INSERTOVERWRITETABLEstudent_orcfile_snappy2SELECTid,nameFROMstudent; --查询数据 SELECT*FROMstudent_orcfile_snappy2; 一般不使用下述方式。下述方式压缩后,结果与上述同类型压缩(SNAPPY)不同。具体原因待进一步研究。 --创建表 CREATETABLEstudent_orcfile_snappy(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASORCFILE; --设置压缩 SEThive.exec.compress.output=true; SETmapred.compress.map.output=true; SETmapred.output.compress=true; SETmapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; SETio.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec; --导入数据 INSERTOVERWRITETABLEstudent_orcfile_snappySELECTid,nameFROMstudent; --查询数据 SELECT*FROMstudent_orcfile_snappy; Parquet Parquet,Snappy压缩 --创建表 CREATETABLEstudent_parquet_snappy(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASPARQUET; --设置压缩 SEThive.exec.compress.output=true; SETmapred.compress.map.output=true; SETmapred.output.compress=true; SETmapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; SETio.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec; --导入数据 INSERTOVERWRITETABLEstudent_parquet_snappySELECTid,nameFROMstudent; --查询数据 SELECT*FROMstudent_parquet_snappy; Avro Avro,Snappy压缩 --创建表 CREATETABLEstudent_avro_snappy(idSTRING,nameSTRING) ROWFORMATDELIMITED FIELDSTERMINATEDBY',' LINESTERMINATEDBY'\n' STOREDASAVRO; --设置压缩 SEThive.exec.compress.output=true; SETmapred.compress.map.output=true; SETmapred.output.compress=true; SETmapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec; SETmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; SETio.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec; --导入数据 INSERTOVERWRITETABLEstudent_avro_snappySELECTid,nameFROMstudent; --查询数据 SELECT*FROMstudent_avro_snappy; 本文作者:hulubo 来源:51CTO