我使用定义的分区在 Amazon Athena 中创建了一个表,但当我查询该表时,没有返回任何记录

上次更新时间:2020 年 4 月 7 日

我使用预期的列及其数据类型在 Amazon Athena 中运行了一个 CREATE TABLE 语句。当我运行查询 SELECT * FROM table-name 时,输出为“返回零条记录”。

解决方法

以下是查询可能会返回零条记录的一些常见原因。

在爬网程序设置中选择的文件

如果您使用爬网程序,请确保爬网程序指向 Amazon Simple Storage Service (Amazon S3) 存储库而不是文件。

不正确的 LOCATION 路径

验证输入数据的 Amazon S3 LOCATION 路径。如果输入 LOCATION 路径不正确,则 Athena 会返回零条记录。

LOCATION 路径中包含双斜杠

Athena 不支持包含双斜杠 (//) 的表格位置路径。例如,以下 LOCATION 路径会返回空结果:

s3://awsexamplebucket/myprefix//input//

要解决此问题,请将文件复制到没有双斜杠的位置。AWS 命令行界面 (AWS CLI) 示例代码:

aws s3 cp s3://awsexamplebucket/myprefix//input// s3://awsexamplebucket/myprefix/input/ --recursive

分区尚未加载

Athena 仅在创建表时创建元数据。仅在您运行查询时解析数据。如果您的表已经具有定义的分区,这些分区可能尚未加载到 AWS Glue 数据目录或 Athena 内部数据目录中。使用 MSCK REPAIR TABLE ALTER TABLE ADD PARTITION 将分区信息加载到目录中。

MSCK REPAIR TABLE

如果分区以 Athena 支持的格式存储,则运行 MSCK REPAIR TABLE 将分区的元数据加载到目录中。例如,如果您有一个在年份分区的表格,则 Athena 预计会在 Amazon S3 路径中找到类似以下内容的数据:

  • s3://awsexamplebucket/athena/inputdata/year=2020/data.csv
  • s3://awsexamplebucket/athena/inputdata/year=2019/data.csv
  • s3://awsexamplebucket/athena/inputdata/year=2018/data.csv

如果数据位于 Athena 预期的 Amazon S3 路径,则通过运行类似以下内容的命令来修复表:

CREATE EXTERNAL TABLE Employee (
    Id INT,
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://awsexamplebucket/athena/inputdata/';

创建表之后,加载分区信息:

MSCK REPAIR TABLE Employee;

加载数据后,再次运行 SELECT * FROM table-name 查询。

ALTER TABLE ADD PARTITION

如果分区未以 Athena 支持的格式存储或位于不同的 Amazon S3 路径,则对每个分区运行 ALTER TABLE ADD PARTITION。例如,假设您的数据位于以下 Amazon S3 路径:

  • s3://awsexamplebucket/athena/inputdata/2020/data.csv
  • s3://awsexamplebucket/athena/inputdata/2019/data.csv
  • s3://awsexamplebucket/athena/inputdata/2018/data.csv

考虑到这些路径,运行类似以下内容的命令:

ALTER TABLE Employee ADD
    PARTITION (year=2020) LOCATION 's3://awsexamplebucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://awsexamplebucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://awsexamplebucket/athena/inputdata/2018/'

加载数据后,再次运行 SELECT * FROM table-name 查询。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?