回答

收藏

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

技术问答 技术问答 348 人阅读 | 0 人回复 | 2023-09-14

我正试图创建以下视图:
8 O& T# y; w5 V"tb1"."date" ASC)"tb1"."date" ASC)它给了我以下错误:
& f/ {+ k0 x6 v( Z* A4 c5 B您的查询有以下错误:不支持的配置单元类型:时间戳
2 z3 O* z: t& _/ R) i- P2 g' w$ ?8 O
但是,当我自己操作查询时,它可以正常工作,这里提到From_iso8601_timestamp作为有效的日期函数。$ E2 O# B" P+ K$ G
谁能告诉我我在做什么?' Z6 j, U. V, a3 o3 I! ?
                                                               
) b1 b- i- U8 l3 _) {    解决方案:                                                                1 w* A  n. m, r" c
                                                                不幸的是,雅典娜并不完全支持它Presto所有功能都有局限性,技术比较Presto几个版本落后。有一些尝试。Athena与AWS Glue, t9 b5 b7 r" J: y+ D  V0 ?6 x* _$ k
Metastore和AWS Glue; W" S- a, k( Z  S2 |/ n
Metastore基于Hive的metastore有些不一致。Spark,Hive,Glue,Athena,Presto等人可以和同一个metastore一起使用可以让生活更轻松,但回到你的问题:
7 L: d1 X( D/ v. b$ v& M/ m5 V这份有关Presto的较旧Teradata提到了分支文件presto时间戳问题:
+ \4 O# ~# r& [声明带/没有时区的时间戳Presto方法不是sql标准。在Presto两者都使用单词TIMESTAMP声明,例如TIMESTAMP‘2003-12-10) e  \( O. D2 x. _2 V0 A" t
10:32:02.1212’或TIMESTAMP‘2003-12-10 10:32:02.1212
" c; L* Y$ h& U/ E+ X! L) aUTC’。时间戳确定为带时区还是不带时区,具体取决于您是否在时区末添加了时区。在其他系统中,时间戳显式声明为TIMESTAMP WITH TIME
7 p* u& ?1 q1 wZONE或TIMESTAMP WITHTIME TIME ZONE
* O  d# e; c0 R2 OAthena派生的Presto这两个版本确实支持这两个版本timestamp,timestamp withtimezone但支持teradata文件中提到的怪癖不应该是问题。真正的问题是Athena不支持带timezone的时间戳。
) ~7 I3 f& Q8 T- ]! Z您链接到的presto文档显示该函数返回该不受支持的类型的值timestamp withtimezone,因此,您需要将其强制转换为其他支持类型。Athena允许函数和强制转换为当时不支持的数据类型是一种疏忽,希望能补救,但现在你必须解决它。! C% q% I$ S) d% S9 m: W; k  J
你需要做的是CAST()在函数调用周围使用函数,从而改变类型timestamp with time zone为。timestamp  S+ u  n; e) W) ?9 I. H
不幸的是,尽管这取决于字符串的格式,但您可能无法将字符串直接转换为时间戳。你不能用它timestamp字符串之前编写的强制转换样式,如timestamp'2018-01-01 15:00:00不能使用,因为我将在下面解释。/ J* _. H$ O3 X, v+ h
from_iso1601_timestamp()函数返回类型SELECT typeof("real_date") AS real_date_typeFROM(SELECT From_iso8601_timestamp('2018-01-01T15:00:00Z') as "real_date")时时区的时间戳$ E, S2 ?" `0 _& X* C
这行不通SELECT typeof("real_date") AS real_date_typeFROM(SELECT CAST('2018-01-01T15:00:00Z' AS timestamp) as "real_date")SQL错误[FAILED]:INVALID_CAST_ARGUMENT:无法将值转换为时间戳
7 a" v! }. ?; i) A- o这种风格的转换也会回到有时区的时间戳请注意,这种方法SELECT部分有效,说是有效的timestamp,但由于某些内部不一致,你无法创建视图并收到错误的信息。0 X' D- d' [* F/ ]& e0 _0 w% s9 }
CREATE OR replace VIEW test AS SELECT typeof( "real_date" ) AS real_date_typeFROM(SELECT  timestamp '2018-01-01 15:00:00' as "real_date")SQL错误[FAILED]:不能初始化类com.facebook.presto.util.DateTimeZoneIndex. n! N5 F$ B- ]5 s
无论出于什么原因,都需要创建视图java类,而在select不需要中分析值。这是一个应该解决的错误。7 ]: C, s% ?% ]" A! C! o
这行不行CREATE OR REPLACE VIEW testASSELECT typeof("real_date") AS real_date_typeFROM(SELECT CAST(From_iso8601_timestamp('2018-01-01T15:00:00Z') AS timestamp) as "real_date")
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则