Hive分区本质上是分层的吗?

时间:2016-07-18 20:11:12

标签: hive

假设我们将表分区为: -

CREATE EXTERNAL TABLE MyTable (
col1 string,
col2 string,
col3 string
)
PARTITIONED BY(year INT, month INT, day INT, hour INT, combination_id BIGINT);

现在显然年份将存储年份值(例如2016年),月份将存储月份(例如7)存储日期(例如18),小时将以24小时格式存储小时值(例如13)。而combination_id将是所有这些的填充(如果是单位数值填充它,左边是0)值的组合。因此,在这种情况下,例如组合ID是2016071813。

所以我们解雇查询(让我们称之为查询A ): -

select * from mytable where combination_id = 2016071813

现在Hive并不知道combination_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

但如果这不利用分区方案,则会妨碍性能。

1 个答案:

答案 0 :(得分:1)

是。 Hive分区是分层的。 您可以通过使用以下查询打印表的分区来检查这一点。

show partitions MyTable;

输出:

year=2016/month=5/day=5/hour=5/combination_id=2016050505
year=2016/month=5/day=5/hour=6/combination_id=2016050506
year=2016/month=5/day=5/hour=7/combination_id=2016050507

在您的方案中,如果您不使用查询,则不需要将combination_id指定为分区列。

您可以通过

进行分区
Year, month, day, hour columns

combination_id only

按多列分区有助于分组操作的性能。

假设您想要找到' March'的最大col1。年份(2016年和2015年)。

它可以通过转到特定的“年份”轻松获取记录。分区(年份= 2016/2015)和月份分区(月份= 3)