2016-04-19 14 views
0

Wie kann ich eine string, die eine Datetime im Format "YYYY-MM-DD;HH:MM:SS" (d. H. 2016-04-11;19:38:01) darstellt, in eine ordnungsgemäße timestamp konvertieren?Zeichenfolge in Timepamp in Impala konvertieren

Ich dachte, das würde funktionieren, aber es nicht.

+2

Dies gibt "WARNINGS: Falsches Datum/Zeit-Konvertierungsformat: JJJJ-MM-TT; HH: MM: SS" zurück. Wenn Sie das Handbuch lesen, heißt es, dass Großschreibung wichtig ist. Hier ist es: http://www.cloudera.com/documentation/enterprise/latest/topics/impala_datetime_functions.html. Sie suchen nach dem Abschnitt from_unitime, um zu erklären, wie Sie das Format in unix_timestamp verwenden. – jbapple

Antwort

4

Wie von @jbapple in einem Kommentar zu meiner Frage vorgeschlagen, ist das Problem mit der Großschreibung. Wie in der Dokumentation Impala angegeben

Derzeit ist die Format-String-case-sensitive, insbesondere auf m für Minuten und M für Monate unterscheiden. In Impala 1.3 und höher, können Sie die Reihenfolge der Elemente ändern, alternative Trennzeichen Zeichen verwenden und eine andere Anzahl von Platzhaltern für jede Einheit verwenden. Wenn Sie weitere Instanzen von y, d, H usw. hinzufügen, werden die Ausgabezeichenfolgen auf die angeforderte Anzahl von Zeichen aufgefüllt. Die Ausnahme ist M für Monate, wobei M einen nicht aufgefüllten Wert wie 3 erzeugt, MM einen Null-aufgefüllten Wert wie 03, MMM einen abgekürzten Monatsnamen wie Mar und Sequenzen von 4 oder mehr M erzeugt sind nicht erlaubt. Ein Datum Zeichenfolge mit allen Feldern könnte sein "JJJJ-MM-TT HH: mm: ss.SSSSSS", "TT/MM/JJJJ HH: mm: ss.SSSSSS", "MMM TT, JJJJ HH.mm.ss (SSSSSS) "oder andere Kombinationen von Platzhaltern und Trennzeichen.

Der richtige Weg, es zu schreiben ist:

select 
    from_unixtime(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss")) 
from t1 
limit 100; 
4

Der Rückgabetyp from_unixtime() ist nicht ein "richtiges timestamp", sondern ein String. (Und der Rückgabetyp von unix_timestamp() ist nicht ... ein timestamp, aber ein bigint). Hier

ist, was ich tun, um eine timestamp Rückgabetyp zu erhalten:

select 
    cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp) 
from t1 
limit 100; 

Aus Gründen der Vollständigkeit, hier ist, wie ich mit Zeitzonen umgehen, lokal formatiert Daten und speichert sie als UTC-Zeitstempel:

select 
    to_utc_timestamp(cast(unix_timestamp(`date`, "yyyy-MM-dd;HH:mm:ss") as timestamp), "Europe/Paris") 
from t1 
limit 100; 

Dies setzt voraus, dass das Startflag -use_local_tz_for_unix_timestamp_conversions deaktiviert ist (dies ist die Standardeinstellung).

Verwandte Themen