2015-01-14 38 views
11

Abbiamo una colonna epoca timestamp (BIGINT) memorizzata in Hive. Vogliamo ottenere la data 'aaaa-MM-gg' per questa epoca. Il problema è che la mia epoca è in millisecondi, ad es. 1409535303522. Quindi selezionare il timestamp, da_unapagina (data/ora, 'aaaa-MM-gg') fornisce risultati errati per la data in quanto prevede l'epoca in secondi.Hive from_unixtime per millisecondi

Così ho provato a dividerlo per 1000. Ma poi viene convertito in Double e non possiamo applicare la funzione ad esso. Anche CAST non funziona quando provo a convertire questo doppio in Bigint.

+1

Se si cambia il formato ' aaaa-MM-gg HH: mm: ss.SSS '? – LiMuBei

risposta

22

risolto dal seguente query:

select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10; 
+0

questo non funziona .. dà un errore - Nessun metodo di abbinamento per la classe org.apache.hadoop.hive.ql.udf.UDFFromUnixTime con (double, string). – Arnab

+2

Sì. L'ho aggiornato con una versione fissa – Cristian

1

timestamp_ms è unixtime in millisecondi

SELEZIONA FROM_UNIXTIME (piano (CAST (timestamp_ms AS BIGINT)/1000), 'aaaa-mm- dd HH: mm: ss.SSS ') come created_timestamp FROM table_name;

2

Nella risposta originale si otterrà stringa, ma se si desidera ottenere la data è necessario chiamare pressofuso in più con la data:

select 
    timestamp, 
    cast(from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') as date) as date_col 
from Hadoop_V1_Main_text_archieved 
limit 10; 

Docs per le date di colata e timestamp . Per la conversione di stringhe fino ad oggi:

cast(string as date)
Se la stringa è nella forma 'YYYY-MM-DD', quindi un valore di data corrispondente a quello anno/mese/giorno viene restituito. Se il valore della stringa non corrisponde a questo, allora viene restituito NULL.

tipo Date è disponibile solo da Hive>0.12.0 come accennato here:

DATE (Nota: disponibile solo a partire da Hive 0.12.0)