在Hive中获取sysdate -1

时间:2012-08-06 18:18:12

标签: hadoop mapreduce hive hiveql

有没有办法让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;

它正在寻找所有分区中的数据?为什么?我在查询中做错了什么?

如何在子查询中进行评估以避免扫描整个表格?

4 个答案:

答案 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;

这将给出分区的确定性结果(字符串)。

我知道这是非常冗长的。