Conversion de L'heure locale en heure UTC en Ruche
j'ai cherché beaucoup sur Internet mais je n'ai pas trouvé la réponse. Voici ma question:
j'écris quelques requêtes dans Hive. J'ai un horodatage UTC et je voudrais le changer en heure UTC, par exemple, étant donné l'horodatage 1349049600, je voudrais le convertir en heure UTC qui est 2012-10-01 00:00:00. Cependant, si j'utilise la fonction intégrée from_unixtime(1349049600)
dans la Ruche, j'ai le local PDT temps 2012-09-30 17:00:00.
j'ai réalisé qu'il y a une fonction intégrée appelée from_utc_timestamp(timestamp, string timezone)
. Ensuite, j'ai essayé comme from_utc_timestamp(1349049600, "GMT")
, la sortie est 1970-01-16 06:44:09.6 qui est totalement erronée.
Je ne veux pas changer le fuseau horaire de Hive de façon permanente parce qu'il y a d'autres utilisateurs. Donc, y a-t-il un moyen que je puisse obtenir une chaîne de timestamp UTC de 1349049600 à "2012-10-01 00:00:00"? Merci beaucoup!!
5 réponses
pour autant Que je peux dire, from_utc_timestamp()
nécessite un argument date string, comme "2014-01-15 11:21:15"
, pas un unix de secondes depuis l'epoch valeur. Qui pourrait être pourquoi il donne des résultats bizarres lorsque vous passez un entier?
la seule fonction de Ruche qui traite des secondes d'époque semble être from_unixtime()
ce qui vous donne une chaîne de timestamp dans le fuseau horaire du serveur que j'ai trouvé dans /etc/sysconfig/clock
-"America/Montreal"
dans mon cas.
ainsi vous pouvez obtenir une chaîne de timestamp UTC via to_utc_timestamp(from_unixtime(1389802875),'America/Montreal')
et puis convertissez vers votre fuseau horaire cible avec from_utc_timestamp()
tout cela semble très torturant, en particulier avoir à connecter votre serveur TZ dans votre SQL. La vie serait plus facile s'il y avait un from_unixtime_utc()
fonction ou quelque chose.
mise à Jour:from_utc_timestamp()
traite avec un milli seconds argument aussi bien qu'une chaîne, mais obtient alors la conversion erronée.
Quand j'essaie from_utc_timestamp(1389802875000, 'America/Los_Angeles')
donne "2014-01-15 03:21:15"
ce qui est mauvais.
La réponse correcte est "2014-01-15 08:21:15"
que vous pouvez obtenir (pour un serveur à Montréal) via from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')
Hey je voulais juste ajouter un peu ici, je suggérerais d'essayer d '"automatiser" le fuseau horaire du système. Donc au lieu de statiquement
#STATIC TZ deceleration
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal')
Donner un coup de cette
#DYNAMIC TZ
select to_utc_timestamp(from_unixtime(1389802875), from_unixtime(unix_timestamp(), "z"));
cela utilise juste le format de sortie de chaîne de "from_unixtime
" pour retourner la chaîne timezone (minuscule z)
l'Utiliser comme ceci :
to_utc_timestamp(from_unixtime(timestamp),"PDT")
cet exemple fournit une solution au problème d'avoir une valeur câblée du fuseau horaire du système TZ dans votre code de ruche. Il a été exécuté avec hive 0.10.0 dans un environnement Centos, avec OpenJDK java version 1.6. Parce qu'il implique une manipulation de temps, ces révisions logicielles précises pourraient être importantes. À l'heure actuelle, le système fonctionne à L'EDT. La table tblFiniteZahl est comme un DUAL mais avec environ un million de lignes, de, vous l'avez deviné, des nombres finis. Mais vous pouvez remplacer n'importe quelle table avec au moins 1 rangée. Le truc est de formater l'heure dans un fuseau horaire local mais d'utiliser le format z pour capturer le fuseau horaire et ensuite extraire cette valeur à l'exécution pour passer à la fonction to_utc_timestamp.
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
;
Le résultat est
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
ceci illustre que le to_utc_timestamp prend un second argument de EDT.
I went to currentmillis.com et collé 1349049600 sans se rendre compte que c'était en fait des secondes. Et en effet, il est retourné 1970-01-16 dans la date, ce qui signifie que la fonction que vous avez suggéré: from_utc_timestamp prend réellement des millisecondes comme premier paramètre? Peut-être Pouvez-vous réessayer avec from_utc_timestamp(1349049600000, "GMT")
?