2012-08-06 11 views
5

C'è un modo per ottenere current date -1 in Hive significa sempre yesterdays date? E in questo formato: 20120805?Ottieni il sysdate -1 in Hive

posso correre la mia domanda come questo per ottenere i dati per yesterday's date come oggi è Aug 6th -

select * from table1 where dt = '20120805'; 

Ma quando ho provato a fare in questo modo con date_sub function per ottenere la data di ieri, come la seguente tabella è partizionata su data (dt) colonna.

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

Cerca i dati in tutte le partizioni? Perché? Qualcosa di sbagliato sto facendo nella mia domanda?

Come è possibile eseguire la valutazione in una sottoquery per evitare l'intera scansione della tabella?

risposta

10

Prova qualcosa di simile:

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

Questo funziona se non ti dispiace che l'alveare esegue la scansione dell'intero tavolo. from_unixtime non è deterministico, quindi il pianificatore di query in Hive non ottimizzerà per te. In molti casi (ad esempio i file di registro), la mancata specificazione di una chiave di partizione deterministica può causare l'avvio di un processo di hasdoop molto grande poiché esegue la scansione dell'intera tabella, non solo delle righe con la chiave di partizione specificata.

Se questo è importante per voi, è possibile avviare alveare con un'opzione aggiuntiva

$ hive -hiveconf date_yesterday=20150331 

E nello script o l'uso del terminale alveare

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

Il nome della variabile non ha importanza, né il valore, è possibile impostarli in questo caso per ottenere la data precedente utilizzando i comandi unix. Nel caso specifico del PO

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

in MySQL:

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

In SQLServer:

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

utilizzare questa query:

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

Che dire di Hive, come la domanda chiaramente menzionata per fare la stessa cosa nell'alveare? – ferhan

+0

Sono stato modificato la mia risposta.prova questa query –

+2

Questo non funziona. L'ho appena provato e non ricevo nulla indietro, – ferhan

1

Sembra DATE_SUB assume data in formato yyyy-MM-dd. Quindi potresti dover fare un po 'più di manipolazione del formato per arrivare al tuo formato. Prova questo:

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(),'yyy-MM-dd ')' può essere sostituito con 'current_date' –

0

Utilizzare questa:

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; 

Questo darà un risultato deterministico (una stringa) della partizione.

So che è super dettagliato.