Конвертировать дату в 2015-05-09T09:00:12.123462000 в метку времени unix в улье

Я хочу преобразовать дату в формате "2015-05-09T09:00:12.123462000" в метку времени unix в кусте. UNIX_TIMESTAMP('2015-05-09T09:00:12.123462000') не работает. Я не уверен, как я могу преобразовать это. Мне нужно это, чтобы сравнить две даты в другом формате. Я конвертирую обе даты в метку времени Unix, но это не удается. Может кто-нибудь, пожалуйста, помогите с этим.

Спасибо

2 ответа

Решение

Ваш ввод использует полный формат ISO 8601, с "T" между датой и временем и долями секунды. Hive ожидает формат SQL (т.е. с пробелом между датой и временем), как видно из java.sql.Timestamp и ODBC, с или без доли секунды, как указано в документации Hive.

Просто примените несколько элементарных массажей струн, а затем "бросьте" String в улей Timestamp, И, пожалуйста, забудьте, что хромает туда и обратно в UNIX_TIMESTAMP:

cast(regexp_replace('2015-05-09T09:00:12.123462000', 'T',' ') as Timestamp)

Ответ Самсона Шарфрихтера является правильным и должен быть принят. Я просто добавлю несколько слов о типах java.time.

Преобразование между строкой ↔ java.time.Instant

Классы java.time вытесняют проблемные старые классы даты и времени, такие как java.sql.Timestamp,

Instant класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Ваша входная строка соответствует стандарту ISO 8601. Классы java.time по умолчанию используют форматы ISO 8601 при разборе / генерации строк, представляющих значения даты и времени. Поэтому нет необходимости указывать шаблон форматирования. Вы можете непосредственно проанализировать вашу строку как Instant объект.

В вашей входной строке отсутствует указание смещения от UTC или часового пояса. Если он должен был быть в UTC, добавьте Z за Zulu что означает UTC.

Instant instant = Instant.parse( "2015-05-09T09:00:12.123462000" + "Z" );

Вы можете создать такую ​​строку, просто позвонив toString, Форматтер по умолчанию, используемый toString при необходимости печатает десятичную дробь в группах из трех цифр. В этом примере последние три цифры являются нулями, поэтому они опущены.

String output = instant.toString(); 

2015-05-09T09: 00: 12.123462Z

Чтобы превратить это в строку в стиле SQL, ожидаемую Hive, замените T с пробелом и удалить Z,

String inputForHive = output.replace( "T" , " " ).replace( "Z" , "" );

2015-05-09 09:00:12.123462

Конвертация из чисел

Улей также предусматривает преобразования из:

  • целое число
    Подсчет целых секунд из эпохи Unix / Posix начала 1970 UTC (1970-01-01T00:00:00Z).
  • число с плавающей точкой
    То же, что и выше, но с долей секунды в разрешении до наносекунд.

Второй я предлагаю вам избежать. Типы с плавающей точкой, такие как float, Float, double, а также Double в Java намеренно компромисс между точностью и быстрым временем выполнения. Это часто приводит к посторонним цифрам в конце вашей десятичной дроби. Если вам нужна дробная секунда, придерживайтесь типа String & Instant объект.

Первый может быть легко получен из Instant позвонив getEpochSecond метод. Конечно, это означает потерю данных, так как этот метод оставляет после себя доли секунды.

long secondsSinceEpoch = instant.getEpochSecond();

Идти в другом направлении.

Instant instant = Instant.ofEpochSecond( secondsSinceEpoch );

Сравнение

Как только у вас есть Instant объекты, вы можете сравнить с такими методами, как compareTo, equals, isBefore, isAfter,

Boolean happenedBefore = thisInstant.isBefore( thatInstant );

О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые классы даты и времени, такие как java.util.Date, .Calendar & java.text.SimpleDateFormat,

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на java.time.

Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать…).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval, YearWeek, YearQuarter и многое другое.

Если доступно, вы можете просто использовать следующий синтаксис

1) проверьте, доступны ли UDF в вашей установке улья?

show functions;

2) при просмотре функции from_unixtime():

from_unixtime(your_timestamp_field)

Это решит проблему!

Пожалуйста, комментируйте, если вам понравился мой ответ!

Другие вопросы по тегам