【问题标题】:Is hive partitioning hierarchical in nature?蜂巢分区本质上是分层的吗?
【发布时间】: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


【解决方案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

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

如果您想查找年份中“三月”月份(2016 年和 2015 年)的最大值 col1。

它可以通过转到特定的'Year'分区(year=2016/2015)和月份分区(month=3)轻松获取记录

【讨论】:

  • 因此,如果您按年、月、日、小时、combination_id 的顺序进行分区,然后您只在 partition_id 上进行查询 - 这意味着与按年查询相比,性能会很差,month,day,hour(按这个顺序)对吗?
  • 对。在您的情况下,如果您知道combination_id,那么您就知道年、月、日、小时。因此,最好查询年、月、.. 的特定列,并在这些列上进行分区
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2020-08-26
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多