当我编写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}。
如何修改查询以仅读取所需的分区。
答案 0 :(得分:0)
unix_timestamp()
函数是不确定性的,会阻止查询的正确优化-自2.0版以来,此功能已弃用,而推荐使用CURRENT_TIMESTAMP
和CURRENT_DATE
。
使用current_date,也无需分别计算年份和月份:
where order_month >= substr(date_sub(current_date, 10),1,7)