2013-08-16 12 views
10

Ich suchte viel im Internet, konnte aber nicht die Antwort finden. Hier ist meine Frage:Lokale Zeit konvertieren in UTC Zeit in Hive

Ich schreibe einige Fragen in Hive. Ich habe einen UTC-Zeitstempel und möchte ihn in UTC-Zeit ändern, z. B. mit dem Zeitstempel 1349049600 möchte ich ihn in die UTC-Zeit umwandeln, die 2012-10-01 00:00:00 ist. Wenn ich jedoch die integrierte Funktion from_unixtime(1349049600) in Hive verwende, bekomme ich die lokale PDT-Zeit 2012-09-30 17:00:00.

Ich erkannte eine in Funktion from_utc_timestamp(timestamp, string timezone) genannt aufgebaut ist. Dann versuchte ich es wie from_utc_timestamp(1349049600, "GMT"), ist die Ausgabe 1970-01-16 06: 44: 09.6, die völlig falsch ist.

Ich möchte nicht die Zeitzone von Hive dauerhaft ändern, da es andere Benutzer gibt. Also gibt es eine Möglichkeit, wie ich eine UTC Timestamp Zeichenfolge von 1349049600 zu "2012-10-01 00:00:00" bekommen kann? Danke vielmals!!

Antwort

-1

Ich ging zu currentmillis.com und eingefügt 1349049600 ohne zu merken, dass es tatsächlich Sekunden war. Und in der Tat gab es das 1970-01-16 in dem Datum zurück, was bedeutet, dass die Funktion, die Sie vorgeschlagen haben: from_utc_timestamp tatsächlich Millisekunden als den ersten Parameter nimmt? Vielleicht können Sie es erneut mit from_utc_timestamp(1349049600000, "GMT") versuchen?

+0

Ich habe versucht, das auch, aber die Zeit ist immer noch nicht richtig ... Ich sah sogar einen Post, der sagte, dass wir den 1349049600000 mit einer 1.0 multiplizieren sollten ('1349049600000 * 1.0'), aber auch nicht funktioniert..danke noch für deine Hilfe! – Iam619

+0

Können Sie bitte stattdessen to_utc_timestamp versuchen? Ich glaube, es hat die gleiche Syntax. – Sandman

12

Soweit ich sagen kann, benötigt from_utc_timestamp() ein Datum String-Argument, wie "2014-01-15 11:21:15", kein Unix Sekunden seit Epoch Wert. Könnte es sein, dass es beim Übergeben einer Ganzzahl ungerade Ergebnisse gibt?

Die einzige Hive-Funktion, die mit Epoche Sekunden beschäftigt scheint from_unixtime() zu sein, die Ihnen einen Zeitstempel-String in der Zeitzone Server gibt, die ich in /etc/sysconfig/clock gefunden - "America/Montreal" in meinem Fall.

So können Sie einen UTC-Zeitstempel-String über to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), und dann mit from_utc_timestamp()

Es scheint alles sehr quälend, besonders auf Ihre Zielzeitzone konvertieren mit Ihrem Server TZ in den SQL verdrahten. Das Leben wäre einfacher, wenn es eine Funktion oder so etwas gäbe.


aktualisieren: from_utc_timestamp() mit sowie eine Zeichenfolge, Milli Sekunden Argument befasst sich aber dann wird die Umwandlung falsch.

Wenn ich versuche from_utc_timestamp(1389802875000, 'America/Los_Angeles') gibt es "2014-01-15 03:21:15" was falsch ist.
Die richtige Antwort ist "2014-01-15 08:21:15", die Sie (für einen Server in Montreal) erhalten können über from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')

+1

Ich bin auf Hive 0.10. Das sieht nach folgendem Fehler aus: https://issues.apache.org/jira/browse/HIVE-2867 – patricksurry

2

es wie folgt verwendet:

to_utc_timestamp(from_unixtime(timestamp),"PDT")

+2

Das hat einen Upvote, aber es sieht so aus, als sollte es 'from_utc_timestamp (from_unitime (timestamp)," PDT ")' –

+0

sein @ChrisA. Der Benutzer möchte die Zeit in eine Zeitzone umwandeln, deshalb diese Funktion. –

+2

Ihr Code hat einige Probleme. (1) Ein ungehöriger Tippfehler (z. B. "..._ Zeitzone" -> "..._ Zeitstempel") und (2) die Zeitzone "" PDT "" funktioniert nicht. Dieser Code 'to_utc_timestamp (from_unitime (timestamp)," PST ") funktioniert für mich. – swdev

1

Dieses Beispiel stellt eine Lösung für das Problem, ein fest verdrahteten des Habens Wert der Systemzeitzone TZ in Ihrem Hive-Code. Es wurde unter Verwendung von Hive 0.10.0 in einer Centos-Umgebung mit OpenJDK Java Version 1.6 ausgeführt. Da es sich um Zeitmanipulation handelt, könnten diese präzisen Software-Revisionen von Bedeutung sein. Derzeit arbeitet das System im EDT. Die Tabelle tblFiniteZahl ist wie ein DUAL, aber mit ungefähr einer Million Zeilen von, du hast es erraten, endlichen Zahlen. Aber Sie können jede Tabelle mit mindestens 1 Zeile ersetzen.Der Trick besteht darin, die Zeit in einer lokalen Zeitzone zu formatieren, aber das z-Format zu verwenden, um die Zeitzone zu erfassen und dann diesen Wert zur Laufzeit zur Übergabe an die Funktion to_utc_timestamp zu extrahieren.

select D1, 
     D1E, 
     D1L, 
     D1LT, 
     D1LZ, 
     to_utc_timestamp(D1LT, D1LZ) as D1UTC 
from (
select D1, 
     D1E, 
     D1L, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 1) as D1LT, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 2) as D1LZ 
from (
select D1, 
     D1E, 
     from_unixtime(D1E, 'yyyy-MM-dd HH:mm:ss z') as D1L 
from (
select D1, 
     unix_timestamp(D1,'yyyy-MM-dd HH:mm:ss Z') as D1E 
from (
select '2015-08-24 01:15:23 UTC' as D1 
from tblFiniteZahl 
limit 1 
    ) T1 
    ) T2 
    ) T3 
    ) T4 
; 

Das Ergebnis ist

D1 = 2015-08-24 01:15:23 UTC 
DT3 = 1440378923 
D1L = 2015-08-23 21:15:23 EDT 
D1LT = 2015-08-23 21:15:23 
D1LZ = EDT 
D1UTC = 2015-08-23 21:15:23 

Dies zeigt, dass die to_utc_timestamp ein zweites Argument von EDT nimmt.

3

Hey wollte nur ein wenig hier hinzufügen, würde ich vorschlagen zu versuchen, die Systemzeitzone zu "automatisieren". Anstatt also statisch

#STATIC TZ deceleration  
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal') 

gibt dieses einen Schuss

#DYNAMIC TZ 
select to_utc_timestamp(from_unixtime(1389802875), from_unixtime(unix_timestamp(), "z")); 

Dies nutzt nur das Zeichenfolge Ausgabeformat von „from_unixtime“ die Zeitzone String zurück (Klein z)

Verwandte Themen