新世界来的像梦一样,让我暖洋洋
Hive支持的存储方式
hive支持的存储方式有很多,在平常的练习中,用的最多的还是textfile.
在本篇博客中,不会过度的去讲解每个存储格式的特点以及存储格式的讲解。会通过案例来讲解各个不用存储方式和压缩的情况下,对我们查询数据以及存储空间的影响。
因为orc存储格式或者parquet格式不能直接load ,所以我们一般都是先创建一个存储格式为text的临时表,通过 insert into 表 select * from 临时表
目标表:log_orc ORC存储
临时表:log_text textfile
insert into table log_orc select * from log_text
上面的图片是创建Log_text的建表语句。
但是平常建表的时候并不用写这么详细,举个例子,上面那个表。
create table log_text(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string)
row format delimited
fields terminated by '\t'
load data local inpath ' ' into table log_text
我们创建Log_text表的时候是这样子创建的,上面那个图片是将我们的建表语句标准化。可以看到很多有用的信息,这个表的数据储藏在哪里,用的inputformat和outputfofrmat又是什么。
跟据上面的例子,我们再创建log_orc和log_parquet表
在三个建表语句中,不同的存储格式,有不同的输入输出格式以及不同的序列化。
如果学过mapreduce,那么对于这个也不是特别的陌生,写完map 和 reduce程序后,在Main方法里面就是来配置这些信息,用的是什么Inputformat和outputformat。hive就是将sql转化为Mr的算子,不会使用mr算子没有关系,只需要懂Hive我们依旧可以对数据进行mr式的处理。
不同的存储带来不同的空间:
使用命令行,可以查看相应的表所占的存储空间
可能会有人看不懂,怎么会有三个参数
参数一:该目录下所占的存储空间
参数二:占的总存储空间(hdfs 备份。比如,副本参数为3,8.3 = 2.8 * 3),也就是第二个参数是第一个参数的三倍。至于是几倍,取决与hadoop集群的副本个数
log_orc占的存储空间为2.8M
log_parquet占的存储空间为13.1M
log_text占的存储空间为18.1M
如果知道一些orc和parquet的话,可以知道orc是rcfile的升级版本,parquet是行列式存储,Sequence是hadoop自己就支持的二进制文件格式。
综上所述:存储效率的排序如下
orc > parquet > text
不同的存储格式对查询是有不同的影响的,首先不同的存储格式就会对底层有不同的影响,二进制文件,行式存储,列式存储都会有影响,而且orc和parquet这种文件存储格式都会自己存储一些表的信息,比如有多少行,多少个数据之类的
下面看主题
通过count(*)来进行评判
对log_orc的表进行分析,发现没有走mr程序,直接就输出结果
对log_parquet的表进行分析,发现也没有走mr程序,直接输出结果
对log_text的表进行分析,发现走mr程序了,并且耗时将近16s。10万条数据
为什么log_orc和log_parquet进行count的时候没有走mr,而log_text走了mr。原因很简单,orc和parquet这些文件存储格式会自己附带一些表的信息,比如表有多少行,最大值或者最小值。会附加一些信息。所以会造成在进行一些需要走mr的sql的时候,没有走mr。
hive可以对输入的文件和输出的文件进行压缩。对输入的文件进行压缩,可以理解为在map段进行压缩,对输出文件进行压缩,可以理解为对reduce进行压缩。
如何查看hive支持的压缩:
1.通过配置Hadoop的配置文件. core-site.xml文件
2.通过Hive命令行,set io.compression.codecs
可以看到支持gzip,bzip,snappy,lzo和默认的default压缩算法
在orc文件存储格式里面,有三种压缩方式:
在无压缩格式下的存储空间为7.7M
默认的存储压缩 ZLIB下的存储空间
2.8M
snappy存储压缩下的存储空间
3.7M
ORC文件中压缩效率
默认压缩>snappy>none
明天会更新hive执行计划的详解以及sql进阶之类的一些东西。