5

有什么方法可以始终获取current date -1in Hive 方法吗?yesterdays date并以这种格式20120805-?

我可以像这样运行我的查询来获取yesterday's date今天的数据Aug 6th-

select * from table1 where dt = '20120805';

但是,当我尝试以这种方式date_sub function获取昨天的日期时,因为下表在 date(dt) 列上进行了分区。

select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(),
'yyyyMMdd')) , 1)     limit 10;

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

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

4

4 回答 4

11

尝试类似:

select * from table1 
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd');

如果您不介意 hive 扫描整个表,则此方法有效。from_unixtime不是确定性的,因此 Hive 中的查询计划程序不会为您优化。对于许多情况(例如日志文件),不指定确定性分区键可能会导致启动非常大的 hadoop 作业,因为它将扫描整个表,而不仅仅是具有给定分区键的行。

如果这对您很重要,您可以使用附加选项启动 hive

$ 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")
于 2013-03-06T04:15:02.577 回答
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');
于 2012-08-07T01:38:00.857 回答
1

它看起来像DATE_SUB假设 date 格式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;
于 2014-01-22T00:01:20.330 回答
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;

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

我知道这非常冗长。

于 2017-01-04T08:33:20.147 回答