在Hive中获取sysdate -1

ars*_*nal 5 hadoop hive mapreduce hiveql

有没有什么方法可以让current date -1Hive意味着yesterdays date什么?并采用这种格式 - 20120805

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

select * from table1 where dt = '20120805';
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这样做date_sub function以获得昨天的日期时,下面的表在日期(dt)列上进行了分区.

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

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

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

小智 11

尝试类似的东西:

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

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

如果这对您很重要,您可以使用其他选项启动配置单元

$ hive -hiveconf date_yesterday=20150331
Run Code Online (Sandbox Code Playgroud)

并在脚本或蜂巢终端使用

select * from table1
where dt >= ${hiveconf:date_yesterday};
Run Code Online (Sandbox Code Playgroud)

变量的名称无关紧要,也不是值,您可以在这种情况下设置它们以使用unix命令获取先前日期.在OP的具体情况下

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d")
Run Code Online (Sandbox Code Playgroud)