2014-10-10 93 views
1

在SQL中看起来很简单,但我在使用HiveQL时遇到了日期范围的问题。HiveQL,Hive SQL选择日期范围

我有一个数据集是这样的:

hive> describe logs; 
id string, 
ts string, 
app_id int 

hive> select * from logs limit 5; 
1389 2014-10-05 13:57:01 12 
1656 2014-10-06 03:57:59 15 
1746 2014-10-06 10:58:25 19 
1389 2014-10-09 08:57:01 12 
1656 2014-10-10 01:57:59 15 

我的目标是让不同的ID的最后3天。最好的办法是读取当前系统时间并获取最近3天的唯一标识,但不知道需要放置“unix_timestamp()”的位置。认为该日志记录的实时性和有今天的TS日期,我想如果我通过“TS”像下面添加组使用该查询(第一种方法)

hive > SELECT distinct id FROM logs HAVING to_date(ts) > date_sub(max(ts), 3) and to_date(ts) < max(ts); 
FAILED: SemanticException [Error 10025]: Line 1:45 Expression not in GROUP BY key 'ts' 

,它吐出了这个错误:

hive> SELECT distinct ext FROM pas_api_logs group by ts HAVING to_date(ts) > date_sub(max(ts), 7) and to_date(ts) < max(ts); 
FAILED: SemanticException 1:47 SELECT DISTINCT and GROUP BY can not be in the same query. Error encountered near token 'ts' 

经过无数的尝试,最后的做法是这样的,研究[类似主题] [1]之后。

Select distinct id from (SELECT * FROM logs JOIN logs ON (max(logs.ts) = to_date(logs.ts)) 
UNION ALL 
SELECT * FROM logs JOIN logs ON (to_date(logs.ts) = date_sub(max(logs.ts), 1)) 
UNION ALL 
SELECT * FROM logs JOIN logs ON (to_date(logs.ts) = date_sub(max(logs.ts), 2))); 

显然这也不起作用。有人可以解释一下这个问题吗?

回答

2

所需的结果可以通过使用该语句来获得:
选择从日志不同id其中DATEDIFF(FROM_UNIXTIME(UNIX_TIMESTAMP()),TS)< = 3;

希望它有帮助!

+0

非常感谢你!!!! – user1486507 2014-11-06 21:54:04

+0

如果你有一段时间请帮我解决这个问题。谢谢。 http://stackoverflow.com/questions/25982081/receiving-exception-while-selecting-data-from-bucket-in-hive – Ajaykishan 2014-11-07 01:40:23

+0

另外,如果有人感到慷慨,我提出了一个类似的问题,可以使用一些帮助:http ://stackoverflow.com/questions/33324375/how-do-you-get-event-date-current-date-10-days-in-hiveql – 2015-10-26 02:38:45