0631-6.2-如何确认一个Parquet文件是否被压缩

2019-05-17 12:19:18 浏览数 (1)

1环境准备

  • 测试环境:

1.CDH6.2

2.集群已开启Kerberos

3.Redhat7.4

1.准备一张文本表,数据文件约6GB。

代码语言:javascript复制
create table if not exists hive_table_test (
s1 string,
s2 string,
s3 string,
s4 string,
s5 string,
s6 string,
s7 string,
s8 string,
s9 string,
s10 string,
s11 string
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," 
stored as textfile location '/fayson/hive_table_test';

hadoop fs -put hbase_data.csv /fayson/hive_table_test
select * from hive_table_test limit 1;

2.创建一张Parquet文件表,然后从文本表将数据插入过去。

代码语言:javascript复制
create table if not exists hive_table_test_parquet (
s1 string,
s2 string,
s3 string,
s4 string,
s5 string,
s6 string,
s7 string,
s8 string,
s9 string,
s10 string,
s11 string
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," 
stored as parquet location '/fayson/hive_table_test_parquet';

insert into hive_table_test_parquet select * from hive_table_test;
select * from hive_table_test_parquet limit 1;

3.创建一张Parquet文件表,并设定压缩为Snappy,然后将数据插入过去。

代码语言:javascript复制
set parquet.compression=SNAPPY;

create table hive_table_test_parquet_snappy stored as parquet as select * from hive_table_test_parquet;

select * from hive_table_test_parquet_snappy limit 1;

2问题重现

1.使用Hive的desc命令查看Parquet表hive_table_test_parquet的底层文件格式是否被压缩。

代码语言:javascript复制
hive> desc extended hive_table_test_parquet;

可以看到compressed显示为false,是正确的,因为该表是没有压缩过的单纯的Parquet格式文件。

2.使用Hive的desc命令查看Parquet表hive_table_test_parquet_snappy的底层文件格式是否被压缩。

代码语言:javascript复制
hive> desc extended hive_table_test_parquet_snappy;

可以看到compressed还是显示为false,是不正确的,应该是true才合理。我们可以观察三个表的HDFS底层文件大小来进一步确定。

可以看到文本表>Parquet表>Parquet Snappy表。

自此问题重现成功,即通过Hive的命令无法确认Parquet表到底是否被压缩,这是因为通过Hive的命令即desc extended是没办法确认的,命令打印结果是错误的,这是Hive的一个bug,对应jira编号是HIVE-2250,至今还未修复。

3问题解决

CDH5.2以后的版本开始包含了一个叫parquet-tools的工具,可以用来检查Parquet文件的元数据信息,通过该工具可以查看很详细的Parquet文件信息包含是否被压缩。

1.分别从hive_table_test_parquet和hive_table_test_parquet_snappy表中取出一个文件到本地方便后面通过这个命令来校验。

代码语言:javascript复制
hadoop fs -ls /fayson/hive_table_test_parquet | head -2
hadoop fs -ls /fayson/hive_table_test_parquet_snappy | head -3
hadoop fs -get /fayson/hive_table_test_parquet/000000_0 .
hadoop fs -get /user/hive/warehouse/hive_table_test_parquet_snappy/000001_0 .

2.使用parquet-tools检查hive_table_test_parquet表中的数据。

代码语言:javascript复制
/opt/cloudera/parcels/CDH/lib/parquet/bin/parquet-tools meta 000000_0

可以看到Parquet文件的元数据信息如字段,也可以看到显示为UNCOMPRESSED,即该Parquet是未压缩的。

3.使用parquet-tools检查hive_table_test_parquet_snappy表中的数据。

代码语言:javascript复制
/opt/cloudera/parcels/CDH/lib/parquet/bin/parquet-tools meta 000001_0

可以看到该Parquet文件显示为压缩为SNAPPY,显示正常。问题解决。

4问题总结

1.通过Hive的命令无法确认Parquet表到底是否被压缩,这是因为通过Hive的命令即desc extended是没办法确认的,命令打印结果是错误的,无论文件是否被压缩compressed都显示为false。这是Hive的一个bug,对应jira编号是HIVE-2250,至今还未修复。参考:

https://issues.apache.org/jira/browse/HIVE-2250

2.要想确认Parquet文件是否被压缩可以使用CDH提供的工具parquet-tools,它可以查看一个Parquet的详细元数据信息,如字段信息,是否被压缩以及压缩格式等。

0 人点赞