2014-09-23 2 views
1

У меня есть строка вроде так: "2014-09-02T03:01:09.8093664Z", и я пытаюсь преобразовать ее в локальный часовой пояс. Я попытался from_utc_timestamp(eventTime, 'GMT'), from_utc_timestamp(eventTime, "PDT"), но улей просто возвращает сообщение об ошибке:Hive convert UTC string в datetime

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":"2014-09-02T03:01:09.8093664Z", 
. 
. 
. 
    ... 7 more 
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating Converting field _col0 from UTC to timezone: 'PDT' 

Могу ли я сделать что-то здесь не так?

Я искал StackOverflow и не нашел решение этой проблемы (Local Time Convert To UTC Time In Hive связана, но не решает проблему)

+0

Мне предложили взломать «T» из строки, и Hive должен начать распознавать его как дату и время. Есть ли другой способ преобразования вышеуказанного UTC в локальный? – sargeMonkey

ответ

0

usesful способ решить эту проблему является создание функции UDF, чтобы сделать эту операцию , Этот новый может быть специфичным для этого случая или более универсального, адаптированного к большему количеству преобразований формата даты и времени. Вы можете прочитать ниже некоторые преимущества:

  • Делает улья запрос более читаемым
  • Избегайте дублирования кода, если вам нужна эта операция в других запросах
  • Делает более масштабируемые свои системы, потому что вы можете обновите этот метод, когда захотите
  • Делегируйте сложные операции с кодом Java, и, следовательно, вы сможете test эти сложные части.

Не могли бы вы узнать больше о , как создать настраиваемую UDF here.

Если вам нужно знать , как реализовать этот метод в Java я нашел в Starckoverflow пост, который объясняет вам путь к этому, here у вас есть запись.

3

from_unixtime (UNIX_TIMESTAMP ("2014-09-02T03: 01: 09Z", "yyyy-MM-dd'T'HH: mm: ss'Z '"), "yyyy-MM-dd HH: mm: сс ")

его Conver в 2014-09-02 03:01:09

0

вы должны сначала извлечь время и строку даты в нужном формате, прежде чем превратить его в GMT. Для этого требуется следующий формат: yyyy-MM-dd HH: mm: ss.

Используйте regexp_replace, чтобы извлечь строку, а затем трубу, функции from_utc_timestamp, как это:

select from_utc_timestamp(regexp_replace(event_time,'(\^\\d{4}-\\d{2}-\\d{2})T(\\\d{2}:\\d{2}:\\d{2}).*','$1 $2),'GMT') from my table; 

Ваш выход тогда: 2014-09-01 03:01:09

Успехов!