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

Joe*_*oel 5 amazon-s3 amazon-web-services amazon-athena

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

当我跑步时:

SELECT * 
FROM testdb."awsevaluationtable"
Run Code Online (Sandbox Code Playgroud)

我得到了所有测试数据: 成功查询

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

SELECT * 
FROM testdb."awsevaluationtable" 
WHERE x > 5
Run Code Online (Sandbox Code Playgroud)

我得到:

SYNTAX_ERROR: line 3:7: Column 'x' cannot be resolved
Run Code Online (Sandbox Code Playgroud)

我尝试了各种变化:

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
Run Code Online (Sandbox Code Playgroud)

我还确认x列存在:

SHOW COLUMNS IN sctawsevaluation
Run Code Online (Sandbox Code Playgroud)

列查询

这似乎是一个非常简单的查询,但我无法弄清楚出了什么问题。我在文档中看不到任何明显的内容。任何建议,将不胜感激。

nek*_*uuu 11

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

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

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

字符串用单引号分隔,标识符用双引号引用,而不是反引号:

SELECT name AS "User Name"
FROM "7day_active"
WHERE name = 'foo'
Run Code Online (Sandbox Code Playgroud)

  • 哇,这实际上对我也适用于 aws Athena (4认同)

owl*_*wl7 5

我已根据我当前的调查结果以及我与 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 中,编辑表架构并删除第一列,然后使用正确的列名将其重新插入,或者

  • 在 AWS Athena 中,执行SHOW CREATE TABLE DDL 以编写出有问题的表的脚本,删除生成的脚本中的特殊字符,然后运行该脚本以创建一个您可以查询的新表。

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