一、存储
行存储的特点: 查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。
Hive中常用的存储格式:

1.1 textfile
textfile为默认格式,存储方式为行存储。
1.2 ORCFile
hive/spark都支持这种存储格式,它存储的方式是采用数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。特点是数据压缩率非常高。
1.3 Parquet
Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。

二、压缩

1)常见的压缩格式

在Hadoop中MR一共支持四种编码分别是:default,gzip,bzip2,lzo和snappy

下面是这几种压缩格式的说明:

压缩后文件大小:lzo>gzip>bzip2
压缩速度:lzo>gzip>bzip2
解压速度:lzo>gzip>bzip2

2)hive中压缩设置的方法

  1. Hive中间数据压缩

hive.exec.compress.intermediate:默认该值为false,设置为true为激活中间数据压缩功能。HiveQL语句最终会被编译成Hadoop的Mapreduce job,开启Hive的中间数据压缩功能,就是在MapReduce的shuffle阶段对mapper产生的中间结果数据压缩。在这个阶段,优先选择一个低CPU开销的算法。
mapred.map.output.compression.codec:该参数是具体的压缩算法的配置参数,SnappyCodec比较适合在这种场景中编解码器,该算法会带来很好的压缩性能和较低的CPU开销。设置如下:

set hive.exec.compress.intermediate=true
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec
set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
  1. Hive最终数据压缩

hive.exec.compress.output:用户可以对最终生成的Hive表的数据通常也需要压缩。该参数控制这一功能的激活与禁用,设置为true来声明将结果文件进行压缩。
mapred.output.compression.codec:将hive.exec.compress.output参数设置成true后,然后选择一个合适的编解码器,如选择SnappyCodec。设置如下:

set hive.exec.compress.output=true 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec

3.Hive输入数据(带压缩)
一般生产环境支持的压缩格式是gzip,bzip2
如果是把压缩文件映射到hive表的时候,是对输入的压缩文件有要求的,zip压缩格式不支持,最好是linux自带的压缩格式。

drop table  temp.tmp_test_hbase_txt_hive1;
CREATE external TABLE  temp.tmp_test_hbase_txt_hive1(
   day string,
   time string,
   phone string,
   rowkey string
)row format delimited fields terminated by '|'
;

hdfs dfs -put ./压缩文件.gz  临时表所在的hdfs目录/temp.tmp_test_hbase_txt_hive1
select * from temp.tmp_test_hbase_txt_hive1 limit 10;