【发布时间】:2016-07-18 20:11:11
【问题描述】:
假设我们有一个表分区为:-
CREATE EXTERNAL TABLE MyTable (
col1 string,
col2 string,
col3 string
)
PARTITIONED BY(year INT, month INT, day INT, hour INT, combination_id BIGINT);
现在显然 year 将存储年份值(例如 2016),月份将存储月份值(例如 7),日期将存储日期(例如 18),小时将存储 24 小时格式的小时值(例如13)。并且combination_id 将是所有这些的填充值的组合(如果单个数字值在左边用0 填充)。所以在这种情况下,例如组合 id 是 2016071813。
所以我们触发查询(我们称之为 Query A):-
select * from mytable where combination_id = 2016071813
现在 Hive 不知道 combine_id 实际上是年、月、日和小时的组合。那么这个查询不会充分利用分区吗?
换句话说,如果我有另一个查询,称之为查询B,这会比查询A更优化还是没有区别?:-
select * from mytable where year=2016 and month=7 and day=18 and hour=13
如果 Hive 分区方案本质上是分层的,那么从性能的角度来看,查询 B 应该更好,这就是我的想法。实际上,我想决定是否要从分区方案中完全摆脱combination_id,如果它根本无法提高性能。
使用组合 id 的唯一真正优势是能够在选择中使用 BETWEEN 运算符:-
select * from mytable where combination_id between 2016071813 and 2016071823
但如果这不能利用分区方案,就会影响性能。
【问题讨论】:
-
对两个查询运行
explain select ....,并检查执行计划。这应该会给你一些关于 Hive 优化器如何进行“分区修剪”的线索。
标签: hive