Мне не повезло с поиском этого в течение пары дней.
Если моя схема avro для данных в таблице улья:
{
"type" : "record",
"name" : "messages",
"namespace" : "com.company.messages",
"fields" : [ {
"name" : "timeStamp",
"type" : "long",
"logicalType" : "timestamp-millis"
}, {
…
и я использую presto, чтобы запросить это, я не получаю отформатированные метки времени.
select "timestamp", typeof("timestamp") as type,
current_timestamp as "current_timestamp", typeof(current_timestamp) as current_type
from db.messages limit 1
timestamp type current_timestamp current_type 1497210701839 bigint 2017-06-14 09:32:43.098 Asia/Seoul timestamp with time zone
Я думал, что преобразовать их в метки времени с точностью до миллисекунды не составит труда, но я обнаружил, что у меня нет четкого способа сделать это.
select cast("timestamp" as timestamp) from db.messages limit 1
line 1:16: Cannot cast bigint to timestamp
Также они изменили приведение метки времени presto, чтобы всегда предполагать, что источник находится в секундах. https://issues.apache.org/jira/browse/HIVE-3454
Поэтому, если я использовал from_unixtime()
, мне пришлось бы сократить миллисекунды, иначе это даст мне очень отдаленную дату:
select from_unixtime("timestamp") as "timestamp" from db.messages limit 1
timestamp +49414-08-06 07:15:35.000
Наверняка кто-то другой, кто работает с Presto чаще, знает, как правильно выразить конверсию. (Я не могу перезапустить серверы Presto или Hive, чтобы установить часовой пояс в UTC, кстати).