Конвертировать дату в 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)
Это решит проблему!
Пожалуйста, комментируйте, если вам понравился мой ответ!