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)