当前位置: 首页 > 面试题库 >

在雅典娜上转换为带时区的时间戳失败

陆敏学
2023-03-14
问题内容

我正在尝试创建以下视图:

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作为有效的日期函数。

谁能告诉我我在做什么错?


问题答案:

不幸的是,雅典娜并不完全支持Presto的所有功能,它具有局限性,并且在技术上比Presto落后几个版本。有一些尝试使Athena与AWS Glue
Metastore紧密集成,而AWS Glue
Metastore基于Hive的metastore有一些不一致之处。我希望Spark,Hive,Glue,Athena,Presto等人可以与同一个metastore一起使用,这样可以使生活更轻松,但是回到您的问题:

这份有关Presto的较旧Teradata分支的文档提到了presto中的时间戳问题:

声明带/不带时区的时间戳的Presto方法不是sql标准。在Presto中,两者都使用单词TIMESTAMP声明,例如TIMESTAMP‘2003-12-10
10:32:02.1212’或TIMESTAMP‘2003-12-10 10:32:02.1212
UTC’。时间戳确定为带时区还是不带时区,具体取决于您是否在时区末添加了时区。在其他系统中,时间戳显式声明为TIMESTAMP WITH TIME
ZONE或TIMESTAMP WITHTIME TIME ZONE

Athena派生的Presto版本确实支持这两种版本timestamptimestamp with timezone但支持teradata文档中提到的怪癖,这不应该成为问题。真正的问题是Athena不支持带timezone的时间戳。

您链接到的presto文档显示该函数返回该不受支持的类型的值timestamp with timezone,因此您需要将其强制转换为其他受支持的类型。Athena允许函数和强制转换为当时不支持的数据类型是一种疏忽,希望可以对此进行补救,但是现在您必须解决它。

您需要做的是CAST()在该函数调用周围使用该函数,这会将类型从更改timestamp with time zone为。timestamp

不幸的是,您可能无法将字符串直接转换为时间戳,尽管这取决于字符串的格式。您也不能使用在timestamp字符串之前编写的强制转换样式,例如timestamp '2018-01-01 15:00:00'由于我将在下面解释的原因而无法使用。

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,但是由于某些内部不一致的原因,您无法创建视图,并且会收到错误html" target="_blank">消息。

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"
)


 类似资料:
  • 我想将字符串的数据类型(例如:'2018-03-27T00:20:00.855556Z')转换为时间戳(例如:'2018-03-27 00:20:00')。 但我错了: syntax_error:line 1:100:无法检查varchar是否介于带时区的时间戳和带时区的时间戳之间 该查询针对“vf_aws_metrices”数据库运行,除非由查询限定。请在我们的论坛上发布错误信息或联系客户支持,

  • 返回我女巫是错误的。 但接下来的查询如下: 我看对日期

  • 我有一个表,其中datetime存储为varchar,但表示纪元时间(例如1556895150)。如何在雅典娜/使用presto中将该值识别为时间戳?类似dateadd函数的功能可以工作,但Athena没有dateadd(我设想了类似dateadd('second',expressoin,'1970-01-01 00:00:00'。简单的强制转换(expressoin作为类型)在这里不起作用,因为

  • 这是我在申请表中得到的日期: 将psqlDate转换为joda的最佳方式是什么? [编辑] 我可以使用解析方法。它可以很好地使用时间戳,它可以使用T-分割日期和时间的信息。 这应该与良好的模式一起工作: 带有时区的PostgreSQL时间戳的正确模式是什么?

  • 我已经用FileBeat设置了ELK&我将日志转发到弹性搜索,重写@timestamp字段到日志文件中的时间。下面是它的logstash.conf文件 在上面,我尝试使用以下方法将时间戳的时区设置为IST 但我发现了错误 这是为了避免kibana将时间戳转换为我的本地时区,因为时间戳已经在本地时区IST中。 有人能告诉我如何为时间戳设置IST时区或者设置kibana不将时间戳转换为我的本地时区吗?

  • 我想将时间戳转换为。 这是我到目前为止已经实现的,但是它给了我错误的月份 任何帮助将不胜感激。