存储格式

文件存储格式

hive创建表的时候默认是textfile的文件格式

hive.default.fileformat(该参数决定了hive创建表的存储格式)
hive (default)> set hive.default.fileformat;
hive.default.fileformat=TextFile(默认文本格式)
hive (default)> create table t_2(id int) stored as inputformat "org.apache.hadoop.mapred.TextInputFormat" outputformat "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"(这种方式是之前的写法,现在已经有了更简化的写法:stored as textfile就行)
hive创建表的时候如果不指定文件存储格式,默认就是textfile文件格式
textfile取字段时候,属于全量读取文本,而且读取的文件多大存储过后也是那么大。性能太差了,一般不采用。下面介绍行式存储和列式存储

行式列式存储对比

行式存储

列式存储

总结: 行式存储 :按行进行存储,每行的内容放在一个块里面,优点:用select * 的话查询肯定是行比较快,如果用列式,它会去每个组寻找对应的列,会很慢 缺点:如果每列的数据类型不一样,那么行式存储肯定不好,因为压缩一个文件只能使用一种压缩格式,所以它的压缩比肯定不好。如果列式存储,那么一列的数据类型肯定是一样的,所以选择的压缩格式的压缩比肯定比行式的要好。 列式存储 :一列存一个文件,宽表(字段很多、信息很全的表)一般都会用列式存储。工作中大部分使用列式存储(存储的格式要根据场景选择)

1.sequencefile存储

sequencefile存储图片描述

由上图可以看出,sequencefile存储比textfile格式还要大,因为它的里面还多了一些头文件,里面有记录长度,key的长度和value的长度。这些信息都存下来的话优点是找到offset,就是从那里可以读(索引功能)。这个格式如果和压缩结合使用的话是对valve进行压缩)
hive (default)> create table page_views_seq(
              > 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' 
              > stored as sequencefile;
hive (default)> load data local inpath "/home/hadoop/data1/page_views.dat" overwrite into table page_views_seq;(报错)
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
第一次把page_views.dat文本格式的表导入hive中以sequencefile存储,也就是加载数据的时候会报格式错误,数据此时已经成功导入了,只不过文本格式的文件加载到hive的sequencefile类型的表中会有一些错误。所以需要接下来做一步转化。
hive (default)> insert  into table page_views_seq select * from page_views;
然后查看page_views_seq这个表的大小为20M,原本page_views.dat这张表大小为18.1M。所以这种存储格式生产上一般也不会用

2.RCFile存储

RCFile存储图片描述:

RCFile存储:行列混合存储,现在用的也少,采用这种存储格式创建的表page_views_rc。查看page_views_rc文件大小为17.9M,也就存储比原文件少了百分之十左右,所以也不怎么用。

3.orc存储

用的比较多,查看page_views_orc 文件大小仅为2.8M,根据官方文档我们可以知道它默认是使用了压缩格式的(zlib),当然这个默认下的搭配性能也很好,所以一般就是用默认,查看没有使用压缩格式的orc格式存储的page_views_orc_none表,其大小为7.7M。也还是很小的
更多详解查看下面这篇博客
ORCFile详述

4.parquetfile存储

用的比较多 (查看page_views_parquet,查看其文件大小为13.1M,这个是没有使用压缩的。把它手动设置压缩格式:set parquet.compression=gzip;然后再进行存储一次。查看page_views_parquet_gzip 这个表此时大小为3.9M,也是节省了很大的空间)注:parquet和orc这两种指定压缩格式的方法不一样
注:可以自己手动测一下不同存储格式的查询时间及所耗费的cpu,读的文件的大小,来比较几种不同存储格式的性能

猜你喜欢

转载自blog.csdn.net/qq_42694416/article/details/85159004
今日推荐