2012-08-06 9 views
5

Есть ли способ получить current date -1 в Hive означает yesterdays date всегда? И в этом формате - 20120805?Получить sysdate -1 in Hive

Я могу запустить мой запрос, как это, чтобы получить данные для 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; 

Он ищет данные во всех разделах? Зачем? Что-то не так, что я делаю по моему запросу?

Как я могу сделать оценку в подзапросе, чтобы избежать сканирования всей таблицы?

ответ

10

Попробуйте что-то вроде:

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

Это работает, если вы не против, чтобы улей просматривает всю таблицу. from_unixtime не является детерминированным, поэтому планировщик запросов в Hive не будет оптимизирован для вас. Во многих случаях (например, файлы журналов) не указывая детерминированный ключ раздела, это может привести к очень большому заданию хаоопа, поскольку он будет сканировать всю таблицу, а не только строки с данным ключом раздела.

Если это важно для вас, вы можете запустить улей с дополнительной опцией

$ hive -hiveconf date_yesterday=20150331 

И в сценарии или улья терминала использования

select * from table1 
where dt >= ${hiveconf:date_yesterday}; 

Имя переменной не имеет значения, а также значение, вы можете установить их в этом случае, чтобы получить предыдущую дату с помощью команд unix. В конкретном случае ОП

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d") 
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'); 
+0

Как насчет Куста, так как вопрос четко упоминается, чтобы сделать то же самое в улье? – ferhan

+0

Я был изменен своим ответом.попробуйте этот запрос. –

+2

Это не работает. Я просто попробовал это, и я ничего не получаю, – ferhan

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; 
+0

'FROM_UNIXTIME (UNIX_TIMESTAMP(), 'yyyy-MM-dd')' можно заменить на 'current_date' –

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; 

Это даст детерминированный результат (строку) вашего раздела.

Я знаю, что это супер многословный.