2012-08-06 12 views
5

Czy jest jakiś sposób, aby uzyskać current date -1 zawsze w Hive oznacza yesterdays date? A w tym formacie - 20120805?Pobierz sysdate -1 w ulu

mogę uruchomić mojej kwerendy tak aby uzyskać dane dla yesterday's date jak dzisiaj jest Aug 6th -

select * from table1 where dt = '20120805'; 

Ale kiedy próbowałem robić w ten sposób z date_sub function uzyskać datę wczorajszą jak poniższa tabela jest podzielony na kolumna daty (dt).

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

Szuka danych we wszystkich partycjach? Czemu? Coś nie tak, co robię w moim zapytaniu?

W jaki sposób mogę dokonać oceny w podzapytaniu, aby uniknąć przeskanowania całej tabeli?

Odpowiedz

10

Spróbuj coś takiego:

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

Działa to, jeśli nie przeszkadza ci, że ul rozgląda się po całym stole. from_unixtime nie jest deterministyczny, więc planer zapytań w Hive nie będzie optymalizowany dla Ciebie. W wielu przypadkach (na przykład w plikach dziennika) nieokreślenie deterministycznego klucza partycji może spowodować rozpoczęcie bardzo dużego zadania hadoop, ponieważ skanuje on całą tabelę, a nie tylko wiersze z danym kluczem partycji.

Jeśli liczy się dla ciebie, możesz uruchomić ula z dodatkową opcją

$ hive -hiveconf date_yesterday=20150331 

I w skrypcie lub ula użytku terminalu

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

Nazwa zmiennej nie ma znaczenia, ani wartości, możesz ustawić je w tym przypadku, aby uzyskać wcześniejszą datę za pomocą poleceń unix. W tym konkretnym przypadku OP

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d") 
1

W MySQL:

select DATE_FORMAT(curdate()-1,'%Y%m%d'); 

W sqlserver:

SELECT convert(varchar,getDate()-1,112) 

Korzystanie z tej kwerendy:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d'); 
+0

Co z Hive, jak jednoznacznie zostało wspomniane pytanie, aby zrobić to samo w ulu? – ferhan

+0

Zostałem zredagowaną moją odpowiedzią.spróbuj tego zapytania. –

+2

To nie działa. Właśnie próbowałem tego i nie otrzymuję niczego z powrotem, – ferhan

1

Wygląda DATE_SUB zakłada datę w formacie yyyy-MM-dd. Więc możesz potrzebować więcej manipulacji formatem, aby dostać się do swojego formatu. Spróbuj tego:

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 ')' może być zastąpione 'current_date' –

0

Użyj tego:

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; 

To daje wynik deterministyczny (łańcuch) z partycji.

Wiem, że to super gadatliwe.