我正在使用按年,月和日划分的Hive表。例如
vector::size
。
根据我对Hive工作方式的有限了解,这些可能是在文件夹结构中设置的,其中' 2015'文件夹包含12个月的文件夹,每个月的文件夹里面有28-31天的文件夹。在这种情况下,使用
year=2015 AND month=201512 AND day = 20151231
只需将目录结构向下爬到20151231文件夹即可。我认为仅使用WHERE year = 2015 AND month = 201512 AND day = 20151231
会触发相同的遍历,因此基本上是相同的查询,但我们得到了使用WHERE day = 20151231
格式的示例代码(即引用所有3个分区)。
我使用这两个选项运行了一些基准测试(昨晚和今天早上,当服务器负载非常轻微到不存在时),所花费的时间基本相同。我怀疑示例代码是错误的,我可以使用day分区,但我想确定。
在Hive查询中使用多个彼此子集的分区是否有任何性能优势?
我知道Hive分区被视为列,但是对于非分区列也是如此吗?
答案 0 :(得分:0)
当您在分区表上运行类似的查询时,hive将首先查询Metastore以查找哪些目录必须包含在map / reduce输入中,就像您看到的那样,它们是怎样的并不重要安排(day = 20151231 vs year = 2015 / month = 12 / day = 31)。 如果您使用mysql进行Metastore,则意味着内部的hive会对其数据库运行sql查询,以仅检索要查询的分区。 此SQL查询中的性能差异也可以忽略不计,尤其是与map / reduce作业的持续时间相比。 使用非分区列时,这是完全不同的,因为它们不存储在Metastore中,但需要对数据进行全面扫描。