2015-01-14 10 views
11

Wir haben eine Zeitstempel Epoch-Spalte (BIGINT) in Hive gespeichert. Wir wollen für diese Epoche das Datum 'JJJJ-MM-TT' bekommen. Problem ist meine Epoche ist in Millisekunden, z.B. 1409535303522. So wählen Sie Timestamp, from_unitime (Timestamp, "JJJJ-MM-TT") gibt falsche Ergebnisse für das Datum, da es Epochen in Sekunden erwartet.Hive from_unitime für Millisekunden

Also habe ich versucht, es durch 1000 zu teilen. Aber dann wird es in Double umgewandelt und wir können keine Funktion darauf anwenden. Selbst CAST funktioniert nicht, wenn ich versuche, dieses Double zu Bigint zu konvertieren.

+1

Wenn Sie das Format ändern 'zu JJJJ-MM-TT HH: mm: ss.SSS '? – LiMuBei

Antwort

22

löste es durch folgende Abfrage:

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

das funktioniert nicht .. es gibt einen Fehler - Keine passende Methode für die Klasse org.apache.hadoop.hive.ql.udf.UDFFromUnixTime mit (double, string). – Arnab

+2

Yup. Ich habe es mit einer festen Version aktualisiert – Cristian

1

timestamp_ms ist Unix-Zeit in Millisekunden

SELECT FROM_UNIXTIME (floor (CAST (timestamp_ms BIGINT AS)/1000), ‚yyyy-MM- dd HH: mm: ss.SSS ') wie created_timestamp FROM Tabellenname;

2

In der ursprünglichen Antwort, die Sie Zeichenfolge bekommen, aber wenn Sie möchten, dass Datum bekommen Sie zusätzliche Guss mit Datum aufrufen müssen:

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 zum Gießen Termine und Zeitstempel . Bei String bisher Umwandlung:

cast(string as date)
Wenn die Zeichenfolge in der Form ist 'YYYY-MM-DD', dann ein Datumswert in diesem Jahr/Monat/Tag entspricht, wird zurückgegeben. Wenn der Zeichenfolgenwert nicht mit diesem Format übereinstimmt, wird NULL zurückgegeben.

Datumstyp ist nur verfügbar, von Hive>0.12.0 wie erwähnt here:

DATE (Hinweis: Nur verfügbar, beginnend mit Hive 0.12.0)