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的详细元数据信息,如字段信息,是否被压缩以及压缩格式等。