преобразование в метку времени с часовым поясом на Афине не удалось - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать следующий вид:

CREATE OR REPLACE VIEW view_events AS 
(
   SELECT
     "rank"() OVER (PARTITION BY "tb1"."innerid" ORDER BY "tb1"."date" ASC) "r"
   , "tb2"."opcode"
   , "tb1"."innerid"
   , "tb1"."date"
   , From_iso8601_timestamp(tb1.date) as "real_date"
   , "tb2"."eventtype"
   , "tb1"."fuelused"
   , "tb1"."mileage"
   , "tb1"."latitude"
   , "tb1"."longitude"
   FROM
     rt_message_header tb1
   , rt_messages tb2
   WHERE ((("tb1"."uuid" = "tb2"."header_uuid") AND ("tb2"."opcode" = '39')) AND ("tb2"."type" = 'event'))
   ORDER BY "tb1"."innerid" ASC, "tb1"."date" ASC
)

, и он выдает мне следующую ошибку:

Ваш запрос содержит следующие ошибки: НеподдерживаемыйТип куста: отметка времени с часовым поясом

, однако, когда я запускаю запрос самостоятельно, он работает нормально, и отметка From_iso8601_timestamp здесь указывается в качестве допустимой функции даты.

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Столкнулся с чем-то похожим на то, над чем я недавно работал.Служба поддержки AWS подтолкнула меня к решению в Давосе, но в моем случае оно не сработало.Решение, которое в итоге сработало от меня, было:

create or replace view db_name.vw_name AS
select
    from_unixtime(cast(to_unixtime(current_timestamp) AS bigint)) as field_name
from db_name.tbl_name

Это преобразует вывод current_timestamp, равный timestamp with time zone, в timestamp

Если вы хотите проверить данныетип поля, который вы можете использовать:

select typeof(field_name) from db_name.vw_name

Надеюсь, это поможет!

0 голосов
/ 13 июня 2019

Вы можете использовать следующий синтаксис в типе данных Athena over Timestamp (dt):

SELECT id,dt,dt AT TIME ZONE 'America/New_York' as dateTimeNY FROM Table
0 голосов
/ 29 июня 2018

К сожалению, 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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...