假设我们将表分区为: -
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
但如果这不利用分区方案,则会妨碍性能。
答案 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)