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



我正在处理一个按年、月和日进行分区的配置单元表。例如

CCD_ 1。

根据我对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将首先查询元存储,以找到哪些目录必须包含在map/reduce输入中,就像你看到的那样,它们的排列方式并不重要(天=20151231 vs年=2015/月=12/天=31)。如果您将mysql用于元存储,这意味着hive内部将对其数据库运行sql查询,以仅检索要查询的分区。此SQL查询的性能差异也可以忽略不计,尤其是与映射/减少作业的持续时间相比。使用非分区列时情况大不相同,因为这些列不存储在元存储中,但需要对数据进行全面扫描。

最新更新