使用互为子集的 Hive columns/partitions 是否可以提高查询性能?

Does using Hive columns/partitions that are subsets of each other improve query performance?

我正在使用按年、月和日划分的 Hive table。例如

year=2015 AND month=201512 AND day = 20151231

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

WHERE year = 2015 AND month = 201512 AND day = 20151231

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

我 运行 使用这两种选项的一些基准测试(昨晚和今天早上,当服务器负载极轻到不存在时),所用时间基本相同。我怀疑是示例代码有误,直接用day分区就可以了,不过我想确定一下。

在 Hive 查询中使用多个互为子集的分区是否有任何性能优势?

我知道 Hive 分区被视为列,但对于非分区列也是如此吗?

当您 运行 在分区 table 上执行类似查询时,hive 将首先查询 Metastore 以查找哪些目录必须包含在 map/reduce 输入中,然后如您所见,它们的排列方式并不重要(day=20151231 vs year=2015/month=12/day=31)。 如果您使用 mysql 作为 Metastore,这意味着 Hive 内部将 运行 对其数据库进行 sql 查询以仅检索要查询的分区。 此 SQL 查询的性能差异也可以忽略不计,尤其是与 map/reduce 作业的持续时间相比。 使用 non-partition 列时情况完全不同,因为这些列未存储在 Metastore 中,但需要对数据进行全面扫描。