不乱于心,不困于情❤️
不畏将来,不念过往❤️

天空很蓝,太阳很暖
生活于此,快乐于此
生活很简单,快乐也很简单
总会有那么几个瞬间
让你忽然觉得
生活温柔而可爱
🌈🌈🌈
今天我们来探讨Hive的文件存储格式
昨天没说完,今天干脆一次说完
先养眼,在学习
❤️
今天是我阳哥的小蛋糕


技术点
简单说下Hive
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。


这次我们主要从5个点讲
1. Hive文件存储格式
2. 存储Demo汇总(可选)
3. Hive文件的压缩格式
4. 如何将存储和压缩进行整合
5. 总结
这次说的可能和昨天有重复内容
但主要是想放一块来讲


Hive文件的存储格式
textfile
sequencefile(下面简称seq)
orc
parquet(以前还没用过,后来才了解)
textfile和seq都是行式存储
orc和parquet都是列式存储
这里说下行式存储和列式存储区别
(仅为了理解,不作为官方诠释)
行式存储:一行就是一条数据,中间的内容如果需要操作,极易操作数据,且读取数据极快,但占用体积较大
列式存储:在按行存储中再细化到一列一列存储,这样的优势是能够根据数据的物理大小和属性,能够最大程度压缩,但代价就是读取不快。
可以这么理解:(仅供参考)
读操作效率来说,耗时比较:(其实都差不多)
orc < paraquet < seq < textfile
存储效率来说,占用空间比较:(这倒是真的)
orc < parquet < seq < textfile


Demo(存储体积验证,可以跳过去)
textfile
1. 创建表,存储数据格式为textfile
create table log_text (...) row format delimited fields terminated by '\t'
2. 向表中加入数据
load datalocal inpath '/opt/module/datas/log.data'into table log_text ;
3. 查看表中数据大小
这个过程**不会**走MapReduce,而是直接将文件上传到了HDFS,在HDFS上文件的名字还叫log.data
hive (db_hive)> dfs -du -h user/hive/warehouse/db_hive.db/log_text;18.1 M/user/hive/warehouse/db_hive.db/log_text/log.data
ORC
1. 创建表,存储数据格式为ORC
create table log_orc(...) row format delimited fields terminated by '\t'stored as orc ;
2. 向表中加载数据
insert into table log_orcselect * from log_text ;
3. 查看表中数据大小
这个过程要走MapReduce,而且文件是按照列式存储的,还会对文件进行压缩,Orc默认使用的压缩方式是zlib
因此会更加节省空间,hdfs上是新的文件名
hive (db_hive)> dfs -du -h user/hive/warehouse/db_hive.db/log_orc;2.8 M/user/hive/warehouse/db_hive.db/log_orc/000000_0
parquet
1. 创建表,存储数据格式为parquet
create table log_parquet(...) row format delimited fields terminated by '\t'stored as parquet ;
2. 向表中加载数据
insert into table log_parquetselect * from log_text ;
3. 查看表中数据大小
查看表中数据大小这个过程要走MapReduce,而且文件是按照列式存储的,因此会更加节省空间,hdfs上是新的文件名
hive (db_hive)> dfs -du -h user/hive/warehouse/db_hive.db/log_parquet;13.1 M/user/hive/warehouse/db_hive.db/log_parquet/000000_0
总结
存储文件的压缩比总结:
ORC > parquet > seq >textFile
select count(*) from log_text;
select count(*) from log_orc;
select count(*) from log_parquet;
存储文件的查询速度总结:查询速度相近。


压缩和存储结合
在建表的时候,如果我们指定了列式存储的方式,他会默认使用对于的压缩方式将我们的数据进行压缩,与此同时我们能够自己定制在文件存储的时候使用什么样子的压缩方式
不压缩的ORC
1. 创建一个非压缩的的ORC存储方式
create table log_orc_none(...) row format delimited fields terminated by '\t'stored as orc tblproperties ("orc.compress"="NONE");
2. 插入数据
insert into table log_orc_noneselect * from log_text ;
压缩的ORC
1. 创建一个SNAPPY压缩的ORC存储方式
create table log_orc_snappy(...)row format delimited fields terminated by '\t'stored as orc tblproperties ("orc.compress"="SNAPPY");
2. 插入数据
insert into table log_orc_snappyselect * from log_text ;
默认压缩的ORC
1. 创建一个非压缩的的ORC存储方式
create table log_orc(...) row format delimited fields terminated by '\t'stored as orc ;
2. 插入数据
insert into table log_orcselect * from log_text ;
总结
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_none;18.1 M /user/hive/warehouse/db_hive.db/log_orc_none/log.datahive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_snappy;3.8 M /user/hive/warehouse/db_hive.db/log_orc_snappy/000000_0hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;2.8 M /user/hive/warehouse/db_hive.db/log_orc/000000_0
没有压缩的orc格式相当于textfile,默认的压缩格式压缩比最大,
snappy对数据进行了压缩
orc存储文件默认采用ZLIB压缩,
ZLIB采用的是deflate压缩算法
因此比snappy压缩的小
文件没有压缩的话,HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名


比对三种主流的文件存储格式TEXTFILE 、ORC、PARQUET
压缩比
ORC > Parquet > seq > textFile(textfile没有进行压缩)
查询速度:三者几乎一致
HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名


其实说了这么多,就一般公司和业务场景来讲,都不会太过于看重存储格式即压缩格式。
因为就硬件价格而言,硬盘的价格在批量化情况下价格已下跌到极致(再大批发的情况下)
并且就某云盘而言,也不一定非要按照hadoop的默认三份备份机制来进行存储,可以选择制定制化开发,详情可谷歌!


郭大熊的公众号
个人博客 : www.guodaxiong.com
如果不曾见过阳光,我本可以忍受黑暗
Hi GuoDaXiong
我是狗子
祝你幸福






