文件存储格式
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取字段时候,属于全量读取文本,而且读取的文件多大存储过后也是那么大。性能太差了,一般不采用。下面介绍行式存储和列式存储
行式列式存储对比
行式存储
列式存储
1.sequencefile存储
sequencefile存储图片描述
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存储图片描述:
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,读的文件的大小,来比较几种不同存储格式的性能