大数据框架Hive——Hive的优化:中间表、设置压缩格式、列式存储、列式存储格式结合压缩格式

Hive优化——中间表

为什么使用中间表

一张大的表中,常涉及几十到上百个字段

但是分析数据时需要的数据,只有几个字段

但如果此时分析原表,需要扫描的字段就太多了

那么,可以将需要使用到的字段抽取出来,存放到另一张表中

可以节省时间,可以理解为使用了更多的空间换取更快的执行速度

使用中间表的方法

方法一:抽取字段,建立新表

该方法就是建立一张新的表,表中的字段是从大表中抽取出的部分字段

分析时直接使用新建的表

而且使用show tables;命令可以直接看到该表

drop table if exists 表名;
create table 表名
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
AS 
SELECT 
   需要的字段名
from
    大表名 

方法二:使用with as 命令

使用该命令,可以建一张临时表,临时表中存储抽取出的字段

然后使用sql语句对该临时表分析

使用show tables;不会看到该张表

注意:with as 后 必须要跟sql语句,否则会报错

with 临时表 as 
(
select 需要的字段 from 大表
)
select 临时表字段 from 临时表;

Hive优化——shuffle优化

hive的底层是MapReduce程序

MapReduce中的shuffle过程

2个阶段:

map 端的shuffle,reduce端的shuffle

3个必选项:

分区Partitioner:决定MapTask输出的数据交给那个reduceTask处理

排序Sorter:很多地方都会发生排序

分组group:将相同Key的value放在一个集合中。

2个可选:

合并Combiner

              在Map端进行Reducer聚合操作。

              并不是所有的MapReduce程序都可以设置Combiner操作

压缩Compress

              压缩Map输出结果数据,减少网络IO和磁盘IO

Hive中查看压缩格式

bin/hadoop checknative

大数据框架Hive——Hive的优化:中间表、设置压缩格式、列式存储、列式存储格式结合压缩格式_第1张图片

 设置压缩格式

在hive中,设置压缩格式之前,要打开两个属性

set hive.exec.compress.intermediate = true;
set mapreduce.map.output.compress = true;

之后就可以设置压缩格式了

#lz4方式
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.Lz4Codec
#snappy方式
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
#bzip2方式
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.BZip2Codec

lz4与snappy压缩过后的文件大小差距不是很大,bzip2压缩程度最大

列式存储

数据存储在文件中 按照 列 进行存储的

同一列的所有数据 存储在一起的

所占用的磁盘空间将大大减小

文件格式:

parquet

orc/rw

文本文件:按照 行 存储的

在window下可以使用记事本打开

在Linux使用cat/head/tail/more/less打开文件

设置列式存储格式

列式存储数据格式,用在在hive中建表时

即在建立数据表时,就设定好约束条件

建立以列式存储方式存储数据的表

CREATE TABLE 表名(
字段名......
)
PARTITIONED BY (分区名 分区类型 ... )
--设置文件行分割方式
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
--设置文件行列割方式
LINES TERMINATED BY '\n'
--设置文件以列式存储格式存储数据
STORED AS PARQUET;    

parquet格式 + snappy压缩建立表

此种方式过后,数据文件占用空间将大大减小

--设置文件压缩格式
set parquet.compression=snappy;
CREATE TABLE 表名(
字段名......
)
PARTITIONED BY (分区名 分区类型 ... )
--设置文件行分割方式
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
--设置文件行列割方式
LINES TERMINATED BY '\n'
--设置文件以列式存储格式存储数据
STORED AS PARQUET;    

ORC格式 + snappy压缩建立表

CREATE TABLE 表名(
字段名......
)
PARTITIONED BY (date_str STRING ,hour_str STRING )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n'
--设置文件存储格式
STORED AS ORC
--设置压缩格式
TBLPROPERTIES ("orc.compress"="SNAPPY");

 

你可能感兴趣的:(Hadoop)