我正在尝试创建以下视图:
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被提及为有效的日期函数here。
谁能告诉我我在做什么错?
最佳答案
不幸的是,雅典娜并不完全支持Presto的所有功能,它具有limitations并在技术上落后于Presto几个版本。有一些尝试使Athena与AWS Glue Metastore紧密集成,而AWS Glue Metastore基于Hive的metastore有一些不一致之处。我希望Spark,Hive,Glue,Athena,Presto等能够与同一个metastore一起使用,这样会使生活变得更轻松,但是回到您的问题:
此document about an older teradata fork of Presto提到了有关时间戳的一些问题:
Presto声明带/不带时区的时间戳的方法不是
sql标准。在Presto中,两者都用TIMESTAMP字词声明,
例如TIMESTAMP'2003-12-10 10:32:02.1212'或TIMESTAMP'2003-12-10
10:32:02.1212 UTC'。确定时间戳记是否带有或不带有
时区,具体取决于您是否在时区末包含时区
时间戳记。在其他系统中,时间戳被明确声明为
带时区的时间戳或不带时区的时间戳
Athena派生的Presto版本确实支持timestamp
和timestamp with timezone
,但是具有teradata文档中提到的怪癖,这应该不是问题。真正的问题是Athena does not support timestamp with timezone。
您链接到的presto文档显示该函数返回该不受支持的类型timestamp with timezone
的值,因此您需要将其强制转换为其他受支持的类型。 Athena允许函数和强制转换为不支持的数据类型是一种疏忽,希望可以对此进行补救,但是现在您必须解决它。
您需要做的是在该函数调用周围使用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类,而在select中解析值时则不需要。这是一个应该解决的错误。
这行不行
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"
)