Hive 使用互为子集的配置单元列/分区是否会提高查询性能?

Hive 使用互为子集的配置单元列/分区是否会提高查询性能?,hive,partitioning,hiveql,query-performance,Hive,Partitioning,Hiveql,Query Performance,我正在使用一个按年、月、日划分的蜂巢表。e、 g 年=2015,月=201512,日=20151231 根据我对Hive工作方式的有限了解,这些可能是在文件夹结构中设置的,其中“2015”文件夹包含12个月的文件夹,每个月的文件夹中包含28-31天的文件夹。在这种情况下,使用 其中年份=2015,月份=201512,日期=20151231 将沿着目录结构向下爬到20151231文件夹。我认为只使用WHERE day=20151231将触发相同的遍历,因此本质上是相同的查询,但我们得到了使用年、月

我正在使用一个按年、月、日划分的蜂巢表。e、 g

年=2015,月=201512,日=20151231

根据我对Hive工作方式的有限了解,这些可能是在文件夹结构中设置的,其中“2015”文件夹包含12个月的文件夹,每个月的文件夹中包含28-31天的文件夹。在这种情况下,使用

其中年份=2015,月份=201512,日期=20151231

将沿着目录结构向下爬到20151231文件夹。我认为只使用
WHERE day=20151231
将触发相同的遍历,因此本质上是相同的查询,但我们得到了使用
年、月、日格式的示例代码(即引用所有3个分区)

我使用这两个选项运行了一些基准测试(昨天晚上和今天早上,服务器负载非常轻,甚至根本不存在),所花费的时间基本相同。我怀疑示例代码是错误的,我可以只使用day分区,但我想确定一下

在配置单元查询中使用多个彼此为子集的分区是否有性能优势?


我知道配置单元分区被视为列,但对于未分区的列,情况也是如此吗

当您在分区表上运行类似的查询时,hive将首先查询元存储,以查找映射/减少输入中必须包含哪些目录,正如您所看到的,它们的排列方式并不重要(日期=20151231 vs年份=2015/月份=12/天=31)。 如果您对metastore使用mysql,这意味着hive将在内部对其数据库运行sql查询,以仅检索要查询的分区。 此SQL查询中的性能差异也可以忽略不计,特别是与映射/减少作业的持续时间相比。
使用非分区列时会有很大的不同,因为这些列不存储在metastore中,但需要对数据进行完整扫描。

当您在分区表上运行类似的查询时,hive将首先查询metastore,以查找map/reduce输入中必须包含的目录,如您所见,如何安排并不重要(日期=20151231与年份=2015/月份=12/天=31)。 如果您对metastore使用mysql,这意味着hive将在内部对其数据库运行sql查询,以仅检索要查询的分区。 此SQL查询中的性能差异也可以忽略不计,特别是与映射/减少作业的持续时间相比。 使用非分区列时会有很大的不同,因为这些列不存储在metastore中,但需要对数据进行完整扫描