К сожалению, Athena не полностью поддерживает все функции Presto, она имеет ограничения и технически на несколько версий от Presto.Есть некоторая попытка заставить Афину тесно интегрироваться с AWS Glue Metastore, которая, хотя и основана на метастазах Hive, имеет некоторые несоответствия.Хотелось бы, чтобы Spark, Hive, Glue, Athena, Presto и др. Просто работали с одним и тем же метастроем, это облегчило бы жизнь, но вернемся к вашей проблеме:
Этот документ о более старой вилке teradataPresto упоминает некоторые проблемы с меткой времени в presto:
Метод объявления меток времени с / без часового пояса Presto не является стандартом sql.В Presto оба они объявляются с использованием слова TIMESTAMP, например, TIMESTAMP '2003-12-10 10: 32: 02.1212' или TIMESTAMP '2003-12-10 10: 32: 02.1212 UTC'.Временная метка определяется как с часовым поясом или без него, в зависимости от того, включен ли часовой пояс в конце временной метки.В других системах временные метки явно объявляются как TIMESTAMP с зоной времени или TIMESTAMP без зоны времени
Версия Presto, из которой разветвляется Афина, поддерживает как timestamp
, так и timestamp with timezone
, но с этой причудойкак упомянуто в документах teradata, что не должно быть проблемой.Реальная проблема заключается в том, что Athena не поддерживает отметку времени с часовым поясом .
Документы Presto, которые вы связали, чтобы показать, что функция возвращает значение этого неподдерживаемого типа timestamp with timezone
, поэтому вынужно привести его как что-то еще, что поддерживается.Это недосмотр, что Афина разрешает функции и приведение к типу данных, который затем не поддерживается, и, надеюсь, это будет исправлено, но сейчас вам нужно обойти это.
Что вам нужно сделать, это использовать CAST()
функция вокруг этого вызова функции, которая изменит тип с timestamp with time zone
на timestamp
К сожалению, вы, вероятно, не можете привести строку непосредственно к метке времени, хотя это зависит от того, как строка отформатирована,Вы также не можете использовать стиль приведения, когда вы пишете timestamp
перед строкой, например, не можете выполнить timestamp '2018-01-01 15:00:00'
по причинам, которые я объясню ниже.
Тип, возвращаемый функцией from_iso1601_timestamp()
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT From_iso8601_timestamp('2018-01-01T15:00:00Z') as "real_date"
)
отметка времени с часовым поясом
Это не работает
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT CAST('2018-01-01T15:00:00Z' AS timestamp) as "real_date"
)
Ошибка SQL [FAILED]: INVALID_CAST_ARGUMENT: значение не можетбыть приведенным к метке времени
Этот стиль приведения также возвращает метку времени с часовым поясом: (*
Обратите внимание, что часть SELECT этого работает, и он говорит, что это timestamp
,но по какой-то внутренней причине несоответствия вы не можете создать представление и получите ошибку.
CREATE OR replace VIEW test
AS
SELECT typeof( "real_date" ) AS real_date_type
FROM
(
SELECT timestamp '2018-01-01 15:00:00' as "real_date"
)
Ошибка SQL [FAILED]: не удалось инициализировать класс com.facebook.presto.util.DateTimeZoneIndex
По какой-то причине создание представления требует, чтобы класс java при анализе значения в выделении этого не делал. Это ошибка, которую следует устранить.
Это работает, yay
CREATE OR REPLACE VIEW test
AS
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT CAST(From_iso8601_timestamp('2018-01-01T15:00:00Z') AS timestamp) as "real_date"
)