当我在 Amazon Athena 中查询表时,如何解决时间戳异常问题?
上次更新日期:2021 年 4 月 9 日
当我在 Amazon Athena 表中查询 TIMESTAMP 数据列时,出现异常。
简短描述
当您查询包含 TIMESTAMP 数据的 Athena 表时,查询可能会失败,并出现以下任一异常:
- SYNTAX_ERROR:行“>”无法应用于时间戳,varchar(19):如果在查询中的 TIMESTAMP 和 STRING 值之间使用了逻辑运算符(例如“>”),则可能会遇到此异常。
- cast(col as timestamp) with INVALID_CAST_ARGUMENT:如果在具有不受 Athena 支持的数据类型的列上使用强制转换,则可能会遇到此异常。
解决方法
异常:SYNTAX_ERROR:行“>”无法应用于时间戳,varchar(19)
表中的 TIMESTAMP 数据的格式可能错误。Athena 需要 Java TIMESTAMP 格式。使用 Presto 的日期和时间函数或强制转换在查询筛选条件中将 STRING 转换为 TIMESTAMP。有关详细信息,请参阅 Presto 文档中的日期和时间函数以及运算符。
1. 通过运行类似于以下内容的查询来创建表 testdataset1:
CREATE TABLE testdataset1 AS SELECT testid1, testname1, date_parse(testtimestamp1,'%m/%d/%Y %h:%i:%s %p') AS testtimestamp1
FROM (
VALUES
(1, 'a','7/14/2020 8:22:39 AM'),
(2, 'b','8/01/2015 10:22:39 PM'),
(3, 'c','8/13/2017 4:22:39 AM')
) AS t(testid1, testname1, testtimestamp1)
2. 使用 cast 函数对文本值应用时间戳筛选条件(示例:2020-07-14 00:00:00):
SELECT * FROM testdataset WHERE testtimestamp1 < cast('2020-07-14 00:00:00' as timestamp)
异常:cast(col as timestamp) with INVALID_CAST_ARGUMENT
使用 Presto 的日期和时间函数将查询中的列读取为日期或时间戳。
1. 通过运行类似于以下内容的查询来创建表 testdataset2:
CREATE TABLE testdataset2 AS SELECT * FROM
(VALUES
(1, 'a','7/14/2020 8:22:39 AM'),
(2, 'b','8/01/2015 10:22:39 PM'),
(3, 'c','8/13/2017 4:22:39 AM')
) AS t(testid2, testname2, testtimestamp2)
2. 使用 Presto 的 date_parse 函数将 STRING TIMESTAMP 列 testtimestamp2 转换为 JAVA TIMESTAMP 格式:
SELECT testid2,testname2,date_parse(testtimestamp2,'%m/%d/%Y %h:%i:%s %p') AS testtimestamp2 FROM testdataset2