1、背景
昨天在工作中碰到snappy文件导入hive表的问题,第一次遇到snappy文件,然后创建外部表不知道该如何导入了。。。 今天早起写了点demo,查了查资料解决了问题,在此记录并引申一下
2、文件格式
支持的文件格式在官网写的就很明显了
Hive supports several file formats:
- Text File
- SequenceFile
- RCFile
- Avro Files
- ORC Files
- Parquet
- Custom INPUTFORMAT and OUTPUTFORMAT
系统默认是textfile 其他差用的Parquet 和orc 也用的很多 支持列存储,有很不错的压缩比
3、压缩
官网上介绍的不多,仅仅介绍了两种,参考了一篇文章讲解压缩的,并自己测得demo,文章链接https://my.oschina.net/hulubo/blog/915072
测试demo如下
已知有张表 demo 字段名为length 和city,1亿多行,默认textfile存储,大小1.1G
select count(*) from demo
OK
151369134
然后我开启snappy压缩
SET hive.exec.compress.output=true;
SET mapred.compress.map.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
然后我创建一个同名表demo_snappy,通过insert into tableName select ...的方式去插入数据,以此来生成snappy文件,生成后,大小为54M,确实小了很多。
然后我试着去导入这个snappy文件,建立外部表,然后去导入。这里我加了一步,加了分区,因为工作中也要分区,顺便测试了下,标明为demo_snappy111(原谅我不会起名字),一下是建表语句和具体操作
CREATE external TABLE demo_snappy111 (
length string,
city string
)
partitioned by (p_hour string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
location '/user/guanghao/demo_snappy'
msck repair table demo_snappy111 ;
然后查询 是成功的。
5、生产环境
我在家里测好了demo,然后去生产环境跑,还是行不通。经他人求助,这个问题解决了,想想也是自己的问题。
我上面的demo,虽然经过了压缩,但是还是textfile格式,然后建表导入,建的表默认也是stored as textfile格式,所以肯定可以成功。
但是工作中碰到的文件我不知道他是parquet,textfile或者是orc格式,所以这时候我需要一个个的去试。我工作碰到的文件是parquet格式的,所以stored as textfile 是读不出数据来的,stored as orc 也会报错。
注意
1、这里我们用hive去关联文件的时候,stored as后面跟的文件类型要和文件本来的文件类型一致,这样才能导入
2、如果文件使用压缩格式的时候,比如snappy,我们在创建表的后面还要跟上TBLPROPERTIES ("parquet.compression"="SNAPPY");(但是感觉不跟也没有什么影响。。(在关联成为外部表的情况下)求大神解答)
3、导入parquet文件有时候还会报这个错误
> select * from s1mme limit 5;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.IntWritable
Time taken: 0.04 seconds
主要原因就是hive 表字段数据类型 与 parquet 存储的数据类型不对应造成的。
参考这篇文章https://blog.csdn.net/jobschen/article/details/77946628
6、感想
感觉自己菜的不行,这个问题耽误了些时间,后来想想其实真的没有什么,这种问题应该可以自己独立解决的