Hive分区查询正在扫描所有分区

时间:2016-12-10 15:41:39

标签: hadoop hive

当我编写hive查询时,如下所示

select count(*)
from order
where order_month >= '2016-11';

Stage-1的Hadoop作业信息:映射器数量:5;减速机数量:1

我只有5个地图制作者,这意味着只读取所需的分区(2016-11和2016-12)

我使用函数

编写的相同查询
select count(*)
from order
where order_month >= concat(year(DATE_SUB(to_date(from_unixtime(UNIX_TIMESTAMP())),10)),'-',month(DATE_SUB(to_date(from_unixtime(UNIX_TIMESTAMP())),10)));

注意:

  

的concat(年(DATE_SUB(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP())),10)),' - ',月(DATE_SUB(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP())),10)) )   =' 2016-11'

Stage-1的Hadoop作业信息:映射器数量:216;减速机数量:1

这次它正在读取所有分区{即2004-10至2016-12}。

如何修改查询以仅读取所需的分区。

1 个答案:

答案 0 :(得分:0)

unix_timestamp()函数是不确定性的,会阻止查询的正确优化-自2.0版以来,此功能已弃用,而推荐使用CURRENT_TIMESTAMPCURRENT_DATE

使用current_date,也无需分别计算年份和月份:

where order_month >= substr(date_sub(current_date, 10),1,7)