当我在 Amazon Athena 表中查询一列 TIMESTAMP 数据时,出现异常。
简短描述
当您查询包含 TIMESTAMP 数据的 Athena 表时,查询可能会失败,并出现以下两种异常之一:
- "TYPE_MISMATCH: line 1:49: Cannot apply operator: timestamp(3) < varchar(19)": 如果您在查询中的 TIMESTAMP 和 STRING 值之间使用逻辑运算符(例如‘>’),则可能会出现此异常。
- "cast(col as timestamp) with INVALID_CAST_ARGUMENT": 如果您对具有 Athena 不支持的数据类型的列使用 CAST,则可能会出现此异常。
解决方法
逻辑运算符的语法错误
如果您的查询使用逻辑运算符比较时间戳值,则可能会出现异常错误。
表中 TIMESTAMP 数据的格式可能错误。Athena 需要 Java TIMESTAMP 格式。在查询筛选条件中使用 Trino 日期和时间函数将 STRING 转换为 TIMESTAMP,或使用 CAST 将 STRING 转换为 TIMESTAMP。有关详细信息,请参阅 Trino 网站上的 Date and time functions and operators(日期和时间函数及运算符)。
完成以下步骤:
- 使用 STRING 格式的时间戳数据创建表,类似于以下示例:
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)
**注意:**将 testdataset1、testid1、testname1 和 testtimestamp1 替换为您的值。
- 在 STRING 值上使用 CAST 函数来应用时间戳筛选条件:
SELECT * FROM testdataset1 WHERE testtimestamp1 < CAST('2020-07-14 00:00:00' AS timestamp)
**注意:**将 testdataset1 和 testtimestamp1 替换为您的值。
CAST 的参数错误无效
如果您使用 CAST 将列转换为 TIMESTAMP 数据类型,则可能会出现异常错误。
您要转换为 TIMESTAMP 的列的数据类型可能是 Athena 不支持的类型。使用 Trino 日期和时间函数将查询中的列读取为 DATE 或 TIMESTAMP。有关详细信息,请参阅 Trino 网站上的 Date and time functions and operators(日期和时间函数及运算符)。
完成以下步骤:
- 创建与以下示例类似的表:
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)
**注意:**将 testdataset2、testid2、testname2 和 testtimestamp2 替换为您的值。
- 使用 Trino date_parse 函数将您的表转换为 Java TIMESTAMP 格式:
SELECT testid2, testname2, date_parse(testtimestamp2, '%m/%d/%Y %h:%i:%s %p') AS testtimestamp2 FROM testdataset2
**注意:**将 testdataset2、testid2、testname2 和 testtimestamp2 替换为您的值。
相关信息
为什么在 Amazon Athena 中查询表时 TIMESTAMP 结果为空?