有没有办法让Hive中的current date -1
表示总是yesterdays date
?
并采用这种格式 - 20120805
?
我可以像这样运行我的查询来获取yesterday's date
的数据,因为今天是Aug 6th
-
select * from table1 where dt = '20120805';
但当我尝试用date_sub function
这样做以获取昨天的日期,因为下表在日期(dt)列上进行了分区。
select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(),
'yyyyMMdd')) , 1) limit 10;
它正在寻找所有分区中的数据?为什么?我在查询中做错了什么?
如何在子查询中进行评估以避免扫描整个表格?
答案 0 :(得分:11)
尝试类似:
select * from table1
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd');
如果你不介意hive扫描整个表,这是有效的。 from_unixtime
不具有确定性,因此Hive中的查询规划器不会为您优化。对于许多情况(例如日志文件),未指定确定性分区键可能会导致非常大的hadoop作业启动,因为它将扫描整个表,而不仅仅是具有给定分区键的行。
如果这对您很重要,您可以使用其他选项启动配置单元
$ hive -hiveconf date_yesterday=20150331
在脚本或配置单元终端中使用
select * from table1
where dt >= ${hiveconf:date_yesterday};
变量的名称无关紧要,也不是值,您可以在这种情况下设置它们以使用unix命令获取先前日期。在OP的特定情况下
$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d")
答案 1 :(得分:1)
在mysql中:
select DATE_FORMAT(curdate()-1,'%Y%m%d');
在sqlserver中:
SELECT convert(varchar,getDate()-1,112)
使用此查询:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d');
答案 2 :(得分:1)
看起来DATE_SUB
假设日期格式为yyyy-MM-dd
。因此,您可能需要进行更多格式操作才能获得格式。试试这个:
select * from table1
where dt = FROM_UNIXTIME(
UNIX_TIMESTAMP(
DATE_SUB(
FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')
, 1)
)
, 'yyyyMMdd') limit 10;
答案 3 :(得分:0)
使用此:
select * from table1 where dt = date_format(concat(year(date_sub(current_timestamp,1)),'-', month(date_sub(current_timestamp,1)), '-', day(date_sub(current_timestamp,1))), 'yyyyMMdd') limit 10;
这将给出分区的确定性结果(字符串)。
我知道这是非常冗长的。