对大量数据进行查询时,Hive在查询时,会转换成mapreduce任务运行,会显得比较慢。可以通过分区来进行速度上的优化。

分区表建立

新建分区表trans.trans201702

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table trans.trans201702   (
type STRING,
trans_time STRING,
seq STRING,
trans_number STRING,
func STRING,
trans_order STRING,
bs STRING,
price float,
volume STRING,
ask STRING,
bid STRING)
PARTITIONED BY (wcode STRING,trans_date STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

从trans.test201702查询出wcode=’000002.SZ’的数据,然后插入trans.trans201702。

1
2
3
4
5
6
7
8
9
10
11
insert overwrite table trans.trans201702  partition (wcode='000002.SZ',trans_date='20170203')
select se.type,se.trans_time,se.seq,se.trans_number,se.func,se.trans_order,se.bs,se.price,se.volume,se.ask,se.bid from trans.test201702 se
where se.wcode='000002.SZ' and se.trans_date='20170203';

insert overwrite table trans.trans201702 partition (wcode='600208.SH',trans_date='20170203')
select se.type,se.trans_time,se.seq,se.trans_number,se.func,se.trans_order,se.bs,se.price,se.volume,se.ask,se.bid from trans.test201702 se
where se.wcode='600208.SH' and se.trans_date='20170203';

insert overwrite table trans.trans201702 partition (wcode='000005.SZ',trans_date='20170203')
select se.type,se.trans_time,se.seq,se.trans_number,se.func,se.trans_order,se.bs,se.price,se.volume,se.ask,se.bid from trans.test201702 se
where se.wcode='000005.SZ' and se.trans_date='20170203';

在创建分区时,hive会进行mapreduce任务。

查看分区表

删除错误的分区:

1
alter table trans201702 drop partition(wcode='600208.SZ',trans_date=20170203);

查询性能比较

原始查询:

1
2
select * from trans.test201702 where wcode='000002.SZ';
Time taken: 76.164 seconds, Fetched: 668098 row(s)

会进行mapreduce任务

分区后:

1
2
3
4
5
6
7
8
9
10
11
12
select * from trans.trans201702 where wcode='000002.SZ';
Time taken: 0.15 seconds, Fetched: 20567 row(s)

select * from trans.trans201702 where trans_date='20170203';
Time taken: 0.176 seconds, Fetched: 20567 row(s)

select * from trans.trans201702 where wcode='600208.SH';
Time taken: 0.145 seconds, Fetched: 3158 row(s)

select * from trans.trans201702 where trans_date='20170203';
Time taken: 0.157 seconds, Fetched: 26516 row(s)


查询时间相比没有创建分区前大幅缩短。

分区之后基本解决了股票的查询速度缓慢的问题

建议

Hive分区操作就是实际上就是分目录,把一个大的数据集根据业务需要分割成更小的数据集,在这个过程中会创建很多分区的文件夹,如果分区过多,文件夹又太小,不利于发挥hadoop的优势,可能造成性能的损耗。建议将trans数据按照股票代码进行分区。

可以通过修改动态分区大小数目和文件来调整hive支持的分区数量。