2014-10-14 5 views
5

У меня есть строка «20141014123456789», которая представляет временную метку с миллисекундами, которую мне нужно преобразовать в метку времени в Hive (0.13.0), не теряя миллисекунды.Как преобразовать строку в метку времени с миллисекундами в Hive

Я попытался это, но UNIX_TIMESTAMP возвращает целое число, так что я теряю миллисекунды:

from_unixtime(unix_timestamp('20141014123456789', 'yyyyMMddHHmmssSSS'))  >> 2014-10-14 12:34:56  

Кастинг строку работы:

cast('2014-10-14 12:34:56.789' as timestamp)  >> 2014-10-14 12:34:56.789 

но моя строка не в такой форме.

Думаю, мне нужно переформатировать мою строку с '20141014123456789' до '2014-10-14 12: 34: 56.789'. Моя задача - это сделать это без грязной конкатенации подстрок.

ответ

8

Я нашел способ избежать грязный конкатенации подстрок, используя следующий код:

select cast(regexp_replace('20141014123456789', 
          '(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})', 
          '$1-$2-$3 $4:$5:$6.$7') as timestamp) 
+0

это интересно. Не могли бы вы подробно рассказать о том, что вы делаете?> –

0

Я не думаю, что это можно сделать, не будучи беспорядочным. Потому что согласно документации функции unix_timestamp() она возвращает время в секундах и, следовательно, опускает часть миллисекунд.

"Преобразование времени строки с заданным шаблоном с отметкой времени Unix (в секундах), возвращает 0, если сбой: UNIX_TIMESTAMP ('2009-03-20', 'YYYY-MM-дд') = 1237532400."

Лучший вариант здесь - написать UDF, чтобы справиться с этим, вы хотите избежать беспорядочных конкатенаций. Однако конкатенация (хотя и беспорядочная) была бы лучше для работы.

+0

Мне нравится подход UDF лучше, потому что я могу использовать Java SimpleDateFormat. Почему вы считаете, что конкатенация лучше? Является ли UDF медленнее? –

0

Простая стратегия будет использовать date_format(arg1, arg2), где arg1 является метка времени либо отформатированной строки, даты или отметки времени и arg2 - это формат строки (в arg1). Обратитесь к java-документации SimpleDateFormat для допустимого в аргументе формата.

Таким образом, в данном случае:

date_format('20141014123456789', 'yyyyMMddHHmmssSSS') 

даст следующую строку: '2014-10-14 12:34:56.789', который затем может быть приведен в качестве временной метки:

cast(date_format('20141014123456789', 'yyyyMMddHHmmssSSS') as timestamp) 

Данное заявление будет возвращать временную метку (по желанию).

+0

is date_format a Hive UDF? –

0

У меня было поле даты в этой форме 2015-07-22T09: 00: 32.956443Z (хранится как строка). Мне нужно было сделать некоторые манипуляции с датами. следующую команду, даже если немного грязный работал хорошо для меня :)

select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename; 

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

Смежные вопросы