Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 蜂巢分区本质上是分层的吗?_Hive - Fatal编程技术网

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

Hive 蜂巢分区本质上是分层的吗?,hive,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)。组合_id将是所有这些的填充值

假设我们将一个表分区为:-

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)。组合_id将是所有这些的填充值的组合(如果一位数的值在左边用0填充)。因此,在这种情况下,例如,组合id是2016071813

所以我们启动查询(我们称之为查询A):-

现在Hive不知道组合id实际上是年、月、日和小时的组合。那么,这个查询不会适当地利用分区吗

换句话说,如果我有另一个查询,称之为查询B,这会比查询A更优化还是没有区别-

select * from mytable where year=2016 and month=7 and day=18 and hour=13
若配置单元分区方案在本质上是分层的,那个么从性能的角度来看,查询B应该更好,这就是我的想法。实际上,我想决定,如果组合id根本不能提高性能,是否从分区方案中完全去掉组合id

使用组合id的唯一真正优势是能够在select中使用BEVER运算符:-

select * from mytable where combination_id between 2016071813 and 2016071823

但是,如果这不能充分利用分区方案,就会影响性能。

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

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
在您的场景中,如果不使用查询,则不需要将组合_id指定为分区列

您可以通过以下两种方式进行分区:

Year, month, day, hour columns

通过多列进行分区有助于提高分组操作的性能

假设您想在每年的“三月”月份(2016和2015)找到最大col1


它可以通过转到特定的“年”分区(年=2016/2015)和月分区(月=3)轻松获取记录,并检查执行计划。这应该会给你一些关于配置单元优化器如何进行“分区修剪”的线索。因此,在这样一种情况下,你按照年、月、日、小时、组合id的顺序进行分区,然后你只查询分区id——这意味着与按年、月、日、小时(按顺序)进行查询相比,性能会很差,对吗?对。在你的例子中,如果你知道组合id,那么你就知道年、月、日、时。因此,最好查询年、月、月的特定列,。。在这些列上进行分区
Year, month, day, hour columns
combination_id only