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中,设置压缩格式之前,要打开两个属性
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");