三、文件存储格式

1.列式存储和行式存储
(1)列存储的特点:
	因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;
	每个字段的数据类型一定是相同的,可以针对性的设计更好的压缩算法。

(2)行存储的特点:
	查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,
	行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。

(3)基础:
	ORC和PARQUET的存储格式是基于列式存储的。
	TEXTFILE和SEQUENCEFILE是基于行存储的;
2.TextFile格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合gzip,bzip2使用。但使用gzip,hive不会对数据进行切分,从而无法对数据进行并行操作。
3.Orc格式
每个orc文件由一个或多个stripe组成,每个stripe里由三部分,分别
	是Index Data,Row Data,Stripe Footer。
	
(1)Index Data:
	一个轻量级的index,默认是每隔1W行做一个索引。
	这里的索引只是记录某行的各字段在row data中的offset.	
(2)	Row Data:
	存具体的数据,先取部分行,然后对这些行按列进行存储。
	对每个列进行了编码,分成多个Stream来存储。			
(3)	Stripe Footer:
	存的是各个Stream的类型,长度等信息。
	
	
	每个文件有一个File Footer,这里面存的是每个Stripe的行数,每个Column的
		数据类型信息等;
	每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以
		及FileFooter的长度信息等;
	在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,
		再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。
4.Parquet格式
Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该
	文件的数据和元数据,因此Parquet格式文件是自解析的。
在存储Parquet数据的时候会按照Block大小设置行组的大小,每个mapper任务
	处理数据最小单位是一个Block,
这样就可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。

四、主流文件存储格式对比实验

1.textfile
(1)创建存储数据格式为TEXTFILE的表
	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'
	stored as textfile;

(2)向表中加载数据
	load data local inpath '/root/hivedata/log.data' into table log_text;
	
(3)查看表中数据大小
	dfs -du -h /user/hive/warehouse/log_text;
2.orc
(1)创建存储数据格式为orc的表
	create table log_orc(
		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 orc;
	
(2)向表中加载数据
	insert into table log_orc select * from log_text;

(3)查看表中数据大小
	dfs -du -h /user/hive/warehouse/log_orc/;
3.parquet
(1)创建存储数据格式为parquet的表
	create table log_parquet(
		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 parquet;
	
(2)向表中加载数据
	insert into table log_parquet select * from log_text;

(3)查看数据大小
	dfs -du -h /user/hive/warehouse/log_parquet/;
4.存储文件的压缩比总结:
ORC >  Parquet >  textFile
5.存储文件的查询速度测试:
select count(*) from log_text;
select count(*) from log_orc;
select count(*) from log_parquet;
	总结:查询速度相近。