Amazon Athena - 无法在基本 SQL WHERE 查询中解析列

Amazon Athena - Column cannot be resolved on basic SQL WHERE query

我目前正在评估 Amazon Athena 和 Amazon S3。 我已经用 table (awsevaluationtable) 创建了一个数据库 (testdb)。 table 有两列,x (bigint) 和 y (bigint)。

当我运行:

SELECT * 
FROM testdb."awsevaluationtable"

我得到了所有的测试数据:

但是,当我尝试基本的 WHERE 查询时:

SELECT * 
FROM testdb."awsevaluationtable" 
WHERE x > 5

我得到:

SYNTAX_ERROR: line 3:7: Column 'x' cannot be resolved

我尝试了各种变体:

SELECT * FROM testdb.awsevaluationtable WHERE x > 5
SELECT * FROM awsevaluationtable WHERE x > 5
SELECT * FROM testdb."awsevaluationtable" WHERE X > 5
SELECT * FROM testdb."awsevaluationtable" WHERE testdb."awsevaluationtable".x > 5
SELECT * FROM testdb.awsevaluationtable WHERE awsevaluationtable.x > 5

我还确认 x 列存在于:

SHOW COLUMNS IN sctawsevaluation

这似乎是一个非常简单的查询,但我无法弄清楚哪里出了问题。我在 documentation 中没有看到任何明显的东西。如有任何建议,我们将不胜感激。

我注意到原始 table 的 csv 源中的列 headers 带有大写字母(X 和 Y),这与 Athena 中显示的列名称不同。 所以我删除了 table,编辑了 csv 文件,使 headers 为小写(x 和 y),然后重新创建了 table,现在可以使用了!

我已经根据我目前的发现以及我与 AWS Glue 和 Athena 支持团队的联系编辑了我对此问题的回复。

我们遇到了同样的问题 - 无法查询 CSV 文件中的第一列。问题归结为 CSV 文件的编码。简而言之,AWS Glue 和 Athena 目前不支持 UTF-8-BOM 中编码的 CSV。如果您在 Excel 或 Notepad++ 中打开使用字节顺序标记 (BOM) 编码的 CSV,它看起来就像任何以逗号分隔的文本文件。然而,在十六进制编辑器中打开它揭示了潜在的问题。文件开头有一堆特殊字符: 即 BOM。

在 AWS Glue 中处理 UTF-8-BOM CSV 文件时,它会保留这些特殊字符,然后与第一列名称相关联。当您尝试查询 Athena 中的第一列时,您将生成错误。

在 AWS 上有解决这个问题的方法:

  • 在 AWS Glue 中,编辑 table 架构并删除第一列,然后使用正确的列名称将其重新插入,或者

  • 在 AWS Athena 中,执​​行 SHOW CREATE TABLE DDL 脚本来解决问题 table,删除生成的特殊字符脚本,然后 运行 脚本创建一个新的 table,您可以在上面查询。

为了让您的生活更简单,只需确保您的 CSV 编码为 UTF-8。

就我而言,将双引号更改为单引号可解决此错误。

Presto 对字符串文字使用单引号,对标识符使用双引号。

https://trino.io/docs/current/migration/from-hive.html#use-ansi-sql-syntax-for-identifiers-and-strings

Strings are delimited with single quotes and identifiers are quoted with double quotes, not backquotes:

SELECT name AS "User Name"
FROM "7day_active"
WHERE name = 'foo'