

# 使用查询结果和最近查询
<a name="querying"></a>

Amazon Athena 会将运行的每个查询的查询结果和查询执行结果元数据自动存储在*查询结果位置*（可以在 Amazon S3 中指定）中。如有必要，您可以在此位置访问这些文件以对其进行处理。您还可以直接从 Athena 控制台下载查询结果文件。

Athena 现在为您提供两种管理查询结果的选项；您可以使用客户拥有的 S3 存储桶，也可以选择托管查询结果功能。使用您自己的存储桶，您可以完全控制存储、权限、生命周期策略和保留，从而提供最大的灵活性，但需要更多管理。或者，当您选择托管查询结果选项时，该服务会自动处理存储和生命周期管理，从而无需配置单独的结果存储桶，也不会在预定的保留期后自动清理结果。有关更多信息，请参阅 [托管查询结果](managed-results.md)。

要首次设置 Amazon S3 查询结果位置，请参阅 [使用 Athena 控制台指定查询结果位置](query-results-specify-location-console.md)。

对于运行的每个查询，将自动保存输出文件。要使用 Athena 控制台访问和查看查询输出文件，IAM 主体（用户和角色）需要 Amazon S3 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 操作的权限来获得查询结果位置，并需要 Athena [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryResults.html) 操作的权限。可对查询结果位置进行加密。如果该位置已加密，用户必须具有加密和解密查询结果位置的相应密钥权限。

**重要**  
有权限对查询结果位置执行 Amazon S3 `GetObject` 操作的 IAM 委托人可以从 Amazon S3 中检索查询结果，即使 Athena `GetQueryResults` 操作的权限被拒绝。

**注意**  
当查询被取消或失败时，Athena 可能已将部分结果写入 Amazon S3。在这种情况下，Athena 不会从存储结果的 Amazon S3 前缀中删除部分结果。您必须删除带有部分结果的 Amazon S3 前缀。Athena 使用 Amazon S3 分段上传来写入数据 Amazon S3。我们建议您设置存储桶生命周期策略，以便当查询失败时终止分段上传。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南**》中的 [使用存储桶生命周期策略中止未完成的分段上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)。
在某些情况下，Athena 可能会自动重试查询执行。在大多数情况下，这些查询能够成功完成，并将查询 ID 标记为 `Completed`。这些查询可能在初始尝试时写入了部分结果，并且可能会生成不完整的分段上传。

**Topics**
+ [托管查询结果](managed-results.md)
+ [指定查询结果位置](query-results-specify-location.md)
+ [使用 Athena 控制台下载查询结果文件](saving-query-results.md)
+ [在 Athena 控制台中查看最近的查询](queries-viewing-history.md)
+ [将多个最近的查询下载到 CSV 文件](queries-downloading-multiple-recent-queries-to-csv.md)
+ [配置最近的查询显示选项](queries-recent-queries-configuring-options.md)
+ [将查询历史记录保留 45 天以上](querying-keeping-query-history.md)
+ [在 Amazon S3 中查找查询输出文件](querying-finding-output-files.md)

# 托管查询结果
<a name="managed-results"></a>

使用托管查询结果，您可以运行 SQL 查询，而无需提供用于存储查询结果的 Amazon S3 存储桶。这使您无需预置、管理、控制访问和清理自己的 S3 存储桶。首先，创建新的工作组或编辑现有工作组。在**查询结果配置**下，选择 **Athena 托管**。

**主要 功能**
+ 通过无需在运行查询之前选择 S3 存储桶位置来简化工作流。
+ 使用托管查询结果无需额外费用，并且查询结果的自动删除可减少管理开销和单独的 S3 存储桶清理过程的需要。
+ 简单易上手：可轻松配置新的和预先存在的工作组以使用托管查询结果。您可以在 AWS 账户中混合使用 Athena 托管查询结果和客户管理的查询结果。
+ 简化了 IAM 权限，允许通过与各个工作组绑定的 `GetQueryResults` 和 `GetQueryResultsStream` 访问读取结果。
+ 查询结果将使用您选择的 AWS 拥有的密钥或客户拥有的密钥自动加密。

## 注意事项和限制
<a name="managed-results-considerations"></a>

****
+ 在 Athena 中，对查询结果的访问是在工作组级别进行管理的。为此，您需要对特定工作组的 `GetQueryResults` 和 `GetQueryResultsStream` IAM 操作具有显式权限。`GetQueryResults` 操作确定谁可以以分页格式检索已完成查询的结果，而 `GetQueryResultsStream` 操作确定谁可以流式传输已完成查询的结果（通常由 Athena 驱动程序使用）。
+ 您无法从控制台下载大于 200 MB 的查询结果文件。使用 `UNLOAD` 语句将大于 200 MB 的结果写入可单独下载的位置。
+ 托管查询结果功能不支持[查询结果重用](reusing-query-results.md)。
+ 查询结果 24 小时内可用。在此期间，查询结果将免费存储。此期限过后，查询结果将被自动删除。

## 使用托管查询结果创建或编辑工作组
<a name="using-managed-query-results"></a>

要从控制台创建工作组或使用托管查询结果更新现有工作组，请执行以下操作：

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 打开 Athena 控制台。

1. 从左侧导航中，选择**工作组**。

1. 选择**创建工作组**以创建新的工作组或编辑列表中的现有工作组。

1. 在**查询结果配置**下，选择 **Athena 托管**。  
![\[查询结果配置菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/athena-managed.png)

1. 对于**加密查询结果**，选择所需的加密选项。有关更多信息，请参阅 [选择查询结果加密](#managed-query-results-encryption-at-rest)。

1. 填写所有其他必需的详细信息并选择**保存更改**。

## 选择查询结果加密
<a name="managed-query-results-encryption-at-rest"></a>

加密配置有两个选项：
+ **使用 AWS 拥有的密钥加密** – 这是使用托管查询结果时的默认选项。如果希望查询结果由 AWS 拥有的密钥加密，请选择此选项。
+ **使用客户自主管理型密钥加密** – 如果希望使用客户自主管理型密钥加密和解密查询结果，请选择此选项。要使用客户自主管理型密钥，请在密钥策略部分的 Principal 元素中添加 Athena 服务。有关更多信息，请参阅 [为托管查询结果设置 AWS KMS 密钥策略](#managed-query-results-set-up)。要成功运行查询，运行查询的用户需要访问 AWS KMS 密钥的权限。

## 为托管查询结果设置 AWS KMS 密钥策略
<a name="managed-query-results-set-up"></a>

密钥策略的 `Principal` 部分指定了谁可以使用此密钥。托管查询结果功能引入了必须在 `Principal` 部分中指定的主体 `encryption.athena.amazonaws.com`。此服务主体专门用于访问非 Athena 拥有的密钥。您还必须将 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作添加到用于访问托管结果的密钥策略中。这三个操作是最低允许的操作。

托管查询结果使用您的工作组 ARN 作为[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。由于 `Principal` 部分是一项 AWS 服务，因此您还需要在密钥策略条件中添加 `aws:sourceArn` 和 `aws:sourceAccount`。以下示例显示了对单个工作组具有最低权限的 AWS KMS 密钥策略。

```
 {
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
      ],
    "Resource": "arn:aws:kms:us-east-1:{account-id}:key/{key-id}",
    "Condition": {
    "ArnLike": {
        "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}",
        "aws:SourceArn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}"
    },
    "StringEquals": {
        "aws:SourceAccount": "{account-id}"
    }
}
```

以下示例 AWS KMS 密钥策略允许同一账户 *account-id* 内的所有工作组使用相同的 AWS KMS 密钥。

```
{
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:us-east-1:account-id:key/{key-id}",
    "Condition": {
        "ArnLike": {
          "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:account-id:workgroup/*",
          "aws:SourceArn": "arn:aws:athena:us-east-1:account-id:workgroup/*"
        },
        "StringEquals": {
          "aws:SourceAccount": "account-id"
        }
    }
}
```

除了 Athena 和 Amazon S3 权限外，您还必须获得执行 `kms:GenerateDataKey` 和 `kms:Decrypt` 操作的权限。有关更多信息，请参阅 [Amazon S3 中加密数据的权限](encryption.md#permissions-for-encrypting-and-decrypting-data)。

有关托管查询结果加密的更多信息，请参阅[加密托管查询结果](encrypting-managed-results.md)。

# 加密托管查询结果
<a name="encrypting-managed-results"></a>

Athena 提供以下用于加密[托管查询结果](managed-results.md)的选项。

## 使用 AWS 拥有的密钥进行加密
<a name="encrypting-managed-results-aws-owned-key"></a>

这是使用托管查询结果时的默认选项。此选项表示您要使用 AWS 拥有的密钥对查询结果进行加密。AWS 拥有的密钥不会存储在您的 AWS 账户中，而是 AWS 拥有的 KMS 密钥集合的一部分。当您使用 AWS 拥有的密钥时，无需支付任何费用，并且它们不会计入您账户的 AWS KMS 配额。

## 使用 AWS KMS 客户自主管理型密钥进行加密
<a name="encrypting-managed-results-customer-managed-key"></a>

客户自主管理型密钥是在您的 AWS 账户中由您创建、拥有和管理的 KMS 密钥。您可以完全控制这些 KMS 密钥，包括建立和维护其密钥策略、IAM 策略和授权、启用和禁用它们、轮换其加密材料、添加标签、创建引用它们的别名以及安排删除它们。有关更多信息，请参阅[客户自主管理型密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

## Athena 如何使用客户自主管理型密钥对结果进行加密
<a name="encrypting-managed-results-how-ate-uses-cmk"></a>

当您指定客户自主管理型密钥时，Athena 会在将查询结果存储在托管查询结果中时使用它来加密查询结果。当您调用 `GetQueryResults` 时，将使用相同的密钥来解密结果。当您将客户自主管理型密钥的状态设置为禁用或安排删除它时，它会阻止 Athena 和所有用户使用该密钥加密或解密结果。

Athena 使用信封加密和密钥层次结构来加密数据。您的 AWS KMS 加密密钥用于生成和解密此密钥层次结构的根密钥。

每个结果都使用加密时在工作组中配置的客户自主管理型密钥进行加密。将密钥切换到其他客户自主管理型密钥或 AWS 拥有的密钥不会使用新密钥重新加密现有结果。删除和禁用特定客户自主管理型密钥只会影响密钥加密的结果的解密。

Athena 需要访问您的加密密钥来执行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作以加密和解密结果。有关更多信息，请参阅 [Amazon S3 中加密数据的权限](encryption.md#permissions-for-encrypting-and-decrypting-data)。

除了 Athena 和 Amazon S3 权限之外，使用 `StartQueryExecution` API 提交查询并使用 `GetQueryResults` 读取结果的主体还必须对客户自主管理型密钥具有执行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作的权限。有关更多信息，请参阅[AWS KMS 中的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

# 指定查询结果位置
<a name="query-results-specify-location"></a>

Athena 使用的查询结果位置由工作组设置和*客户端设置*共同决定。客户端设置取决于您运行查询的方式。
+  如果使用 Athena 控制台运行查询，在导航栏中 **Settings**（设置）项下输入的 **Query result location**（查询结果位置）将决定客户端设置。
+ 如果您使用 Athena API 运行查询，则 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 操作的 `OutputLocation` 参数将决定客户端设置。
+ 如果您使用 ODBC 或 JDBC 驱动程序来运行查询，则连接 URL 中指定的 `S3OutputLocation` 属性决定客户端设置。

**重要**  
当您使用 API 或使用 ODBC 或 JDBC 驱动程序运行查询时，控制台设置不适用。

每个工作组配置都有一个可启用的[Override client-side settings (覆盖客户端设置)](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html) 选项。如果启用此选项，当与工作组关联的 IAM 委托人运行该查询时，工作组设置优先于适用的客户端设置。

## 关于以前创建的默认位置
<a name="query-results-specify-location-previous-defaults"></a>

以前，在 Athena 中,如果您在运行查询时未为 **Query result location**（查询结果位置）指定值，并且查询结果位置设置未被工作组覆盖，则 Athena 会为您创建默认位置。默认位置为 `aws-athena-query-results-MyAcctID-MyRegion`，其中 *MyAcctID* 是运行查询的 IAM 委托人的 Amazon Web Services 账户 ID，*MyRegion* 是运行查询的区域（例如 `us-west-1`）。

现在，您必须指定查询结果位置或使用覆盖查询结果位置设置的工作组，然后才能在您的账户以前未使用 Athena 的区域中运行 Athena 查询。虽然 Athena 不再为您创建默认查询结果位置，但之前创建的默认 `aws-athena-query-results-MyAcctID-MyRegion` 位置仍然有效，您可以继续使用它们。

**Topics**
+ [关于以前创建的默认位置](#query-results-specify-location-previous-defaults)
+ [使用 Athena 控制台指定查询结果位置](query-results-specify-location-console.md)
+ [使用工作组指定查询结果位置](query-results-specify-location-workgroup.md)

# 使用 Athena 控制台指定查询结果位置
<a name="query-results-specify-location-console"></a>

在运行查询之前，必须指定 Amazon S3 中的查询结果存储桶位置，或者您必须使用已指定存储桶且其配置覆盖客户端设置的工作组。

**使用 Athena 控制台指定客户端设置查询结果位置**

1. [切换](switching-workgroups.md)到要为其指定查询结果位置的工作组。工作组的默认名称为 **primary**。

1. 从导航栏中选择 **Settings**（设置）。

1. 从导航栏中选择 **Manage**（管理）。

1. 对于 **Manage settings**（管理设置），执行以下操作之一：
   + 在 **Location of query result**（查询结果位置）文本框中，输入您在 Amazon S3 中为查询结果创建的存储桶路径。在路径前添加前缀 `s3://`。
   + 选择 **Browse S3**（浏览 S3），选择您为当前区域创建的 Amazon S3 存储桶，然后选择 **Choose**（选择）。
**注意**  
如果使用的工作组为工作组的所有用户指定查询结果位置，则更改查询结果位置的选项不可用。

1. （可选）选择 **View lifecycle configuration**（查看生命周期配置），以查看和配置查询结果存储桶上的 [Amazon S3 生命周期规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。您创建的 Amazon S3 生命周期规则可以是到期规则或转移规则。到期规则将在经过一定的时间后自动删除查询结果。转换规则会将查询结果转移到其他 Amazon S3 存储层。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的 [在存储桶上设置生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

1. （可选）在 **Expected bucket owner**（预期存储桶拥有者）中，输入您希望成为输出位置存储桶的拥有者 AWS 账户 的 ID。这是附加安全措施。如果存储桶拥有者的账户 ID 与您在此处指定的 ID 不匹配，则输出到存储桶的尝试将失败。有关更多信息，请参阅《*Amazon S3 用户指南*》中的[使用存储桶拥有者条件验证存储桶所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html)
**注意**  
预期存储桶拥有者设置仅适用于您为 Athena 查询结果指定的 Amazon S3 输出位置。其不适用于其他 Amazon S3 位置，例如外部 Amazon S3 存储桶中的数据源位置、`CTAS` 和 `INSERT INTO` 目标表位置、`UNLOAD` 语句输出位置、为联合查询溢出存储桶的操作，或针对另一个账户中的表运行的 `SELECT` 查询。

1. （可选）如果要加密存储在 Amazon S3 中的查询结果，则选择 **Encrypt query results**（加密查询结果）。要详细了解 Athena 的加密，请参阅[静态加密](encryption.md)。

1. （可选）如果查询结果存储桶[启用了 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)，则选择 **Assign bucket owner full control over query results**（为存储桶拥有者分配对查询结果的完全控制权），以向存储桶拥有者授予对查询结果的完全控制权。例如，假设您的查询结果位置属于其他账户所有，则可以将所有权以及对查询结果的完全控制权授予该其他账户。有关更多信息，请参阅《Amazon S3 用户指南》**中的[控制存储桶的对象所有权和禁用 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

1. 选择**保存**。

# 使用工作组指定查询结果位置
<a name="query-results-specify-location-workgroup"></a>

您使用 AWS 管理控制台、AWS CLI 或 Athena API 在工作组配置中指定查询结果位置。

使用 AWS CLI 时，请在运行 [https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html) 或者 [https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html) 命令时使用 `--configuration` 选项的 `OutputLocation` 参数指定查询结果位置。

**使用 Athena 控制台指定工作组的查询结果位置**

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 在导航窗格中，选择 **Workgroups**（工作组）。

1. 在工作组列表中，选择要编辑的工作组的链接。

1. 选择**编辑**。

1. 对于 **Query result location and encryption**（查询结果位置和加密），请执行以下操作之一：
   + 在 **Location of query result**（查询结果位置）框中，输入 Amazon S3 中用于存储查询结果的存储桶的路径。在路径前添加前缀 `s3://`。
   + 选择 **Browse S3**（浏览 S3），选择为您要使用的当前区域创建的 Amazon S3 存储桶，然后选择 **Choose**（选择）。

1. （可选）在 **Expected bucket owner**（预期存储桶拥有者）中，输入您希望成为输出位置存储桶的拥有者 AWS 账户 的 ID。这是附加安全措施。如果存储桶拥有者的账户 ID 与您在此处指定的 ID 不匹配，则输出到存储桶的尝试将失败。有关更多信息，请参阅《*Amazon S3 用户指南*》中的[使用存储桶拥有者条件验证存储桶所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html)
**注意**  
预期存储桶拥有者设置仅适用于您为 Athena 查询结果指定的 Amazon S3 输出位置。其不适用于其他 Amazon S3 位置，例如外部 Amazon S3 存储桶中的数据源位置、`CTAS` 和 `INSERT INTO` 目标表位置、`UNLOAD` 语句输出位置、为联合查询溢出存储桶的操作，或针对另一个账户中的表运行的 `SELECT` 查询。

1. （可选）如果要加密存储在 Amazon S3 中的查询结果，则选择 **Encrypt query results**（加密查询结果）。要详细了解 Athena 的加密，请参阅[静态加密](encryption.md)。

1. （可选）如果查询结果存储桶[启用了 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)，则选择 **Assign bucket owner full control over query results**（为存储桶拥有者分配对查询结果的完全控制权），以向存储桶拥有者授予对查询结果的完全控制权。例如，假设您的查询结果位置属于其他账户所有，则可以将所有权以及对查询结果的完全控制权授予该其他账户。

   如果存储桶的 S3 Object Ownership（S3 对象所有权）设置为 **Bucket owner preferred**（存储桶拥有者优先），则存储桶拥有者还拥有从此工作组写入的所有查询结果对象。例如，假设某个外部账户的工作组启用了此选项并将其查询结果位置设置为您账户的 Amazon S3 存储桶，并且该存储桶的 S3 Object Ownership（S3 对象所有权）设置为 **Bucket owner preferred**（存储桶拥有者优先），则您将拥有并完全控制该外部工作组的查询结果的访问权限。

   如果查询结果存储桶的 S3 Object Ownership（S3 对象所有权）设置为 **Bucket owner enforced**（存储桶拥有者强制），则选择此选项将不具有效力。有关更多信息，请参阅《Amazon S3 用户指南》**中的[控制存储桶的对象所有权和禁用 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

1. 如果您希望工作组的所有用户使用您指定的查询结果位置，请向下滚动到 **Settings**（设置）部分，然后选择 **Override client-side settings**（覆盖客户端侧设置）。

1. 选择**保存更改**。

# 使用 Athena 控制台下载查询结果文件
<a name="saving-query-results"></a>

运行查询后，您可以立即从查询窗格中下载查询结果 CSV 文件。您还可以从 **Recent queries**（最近的查询）选项卡下载最近查询的查询结果。

**注意**  
Athena 查询结果文件为数据文件，其中包含了可以被单个用户配置的信息。有些数据在用来读取和分析该数据的程序中有可能会将部分数据解释为命令（CSV 注入）。因此，将查询结果 CSV 数据导入到某个电子表格程序时，该程序可能警告您注意安全风险。为了确保系统安全，您应始终选择禁用下载查询结果中的链接或宏。

**运行查询并下载查询结果**

1. 在查询编辑器中输入您的查询，然后选择 **Run**（运行）。

   查询完成运行后，**Results (结果)** 窗格将显示查询结果。

1. 要下载查询结果的 CSV 文件，请选择查询结果窗格上方的 **Download results**（下载结果）。根据您的浏览器和浏览器配置，您可能需要确认下载。  
![\[将查询结果保存到 Athena 控制台中的 .csv 文件。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/getting-started-query-results-download-csv.png)

**下载早期查询的查询结果文件**

1. 选择 **Recent queries**（最近的查询）。  
![\[选择 Recent queries（最近的查询）以查看以前的查询。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/getting-started-recent-queries.png)

1. 使用搜索框查找查询，选择查询，然后选择 **Download results**（下载结果）。
**注意**  
您无法使用 **Download results**（下载结果）来选项检索已手动删除的查询结果，也无法检索已被 Amazon S3 [生命周期规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) 删除或转移至其他位置的查询结果。  
![\[选择 Recent queries（最近的查询）以查找并下载以前的查询结果。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-recent-queries-tab-download.png)

# 在 Athena 控制台中查看最近的查询
<a name="queries-viewing-history"></a>

您可以使用 Athena 控制台查看哪些查询成功或失败，并查看失败查询的错误详细信息。Athena 会将查询历史记录保留 45 天。

**在 Athena 控制台中查看最近的查询**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 选择 **Recent queries**（最近的查询）。**Recent queries**（最近的查询）选项卡显示有关运行的每个查询的信息。

1. 要在查询编辑器中打开查询语句，请选择查询的执行 ID。  
![\[选择查询的执行 ID 以在查询编辑器中进行查看。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-view-query-statement.png)

1. 要查看失败查询的详细信息，请选择该查询的 **Failed**（失败）链接。  
![\[选择查询的 Failed（失败）链接，以查看有关该失败的信息。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-view-query-failure-details.png)

# 将多个最近的查询下载到 CSV 文件
<a name="queries-downloading-multiple-recent-queries-to-csv"></a>

您可以使用 Athena 控制台的 **Recent queries**（最近查询）选项卡将一个或多个最近的查询导出到 CSV 文件，以便以表格格式进行查看。下载的文件不包含查询结果，而是包含 SQL 查询字符串本身及有关查询的其他信息。导出的字段包括执行 ID、查询字符串内容、查询开始时间、状态、运行时、扫描的数据量、使用的查询引擎版本和加密方法。您最多可以导出 500 个最近的查询，或者使用搜索框中输入的条件导出最多 500 个筛选后的查询。

**将一个或多个最近的查询导出到 CSV 文件**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 选择 **Recent queries**（最近的查询）。

1. （可选）使用搜索框筛选要下载的最近查询。

1. 选择**下载 CSV**。  
![\[选择下载 CSV。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-recent-queries-csv.png)

1. 出现文件保存提示时，选择 **Save**（保存）。默认文件名为 `Recent Queries`，后跟时间戳（例如，`Recent Queries 2022-12-05T16 04 27.352-08 00.csv`）

# 配置最近的查询显示选项
<a name="queries-recent-queries-configuring-options"></a>

您可以配置 **Recent queries**（最近的查询）选项卡的选项，例如，要显示的列和文本换行。

**配置 **Recent queries**（最近的查询）选项卡的选项**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 选择 **Recent queries**（最近的查询）。

1. 选择选项按钮（齿轮图标）。  
![\[选择选项按钮，配置最近查询的显示。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-recent-queries-options.png)

1. 在 **Preferences**（首选项）对话框中，选择每页行数、换行行为和要显示的列。  
![\[配置最近查询的显示。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-recent-queries-preferences.png)

1. 选择**确认**。

# 将查询历史记录保留 45 天以上
<a name="querying-keeping-query-history"></a>

如果要将查询历史记录保留超过 45 天，您可以检索查询历史记录并将其保存到 Amazon S3 等数据存储中。要自动执行此过程，您可以使用 Athena 和 Amazon S3 API 操作和 CLI 命令。以下过程总结了这些步骤。

**以编程方式检索和保存查询历史记录**

1. 使用 Athena [ListQueryExecutions](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListQueryExecutions.html) API 操作或 [list-query-executions](https://docs.aws.amazon.com/cli/latest/reference/athena/list-query-executions.html) CLI 命令检索查询 ID。

1. 使用 Athena [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 操作或 [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html) CLI 命令，根据查询的 ID 检索有关各个查询的信息。

1. 使用 Amazon S3 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) API 操作或 [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html) CLI 命令将信息保存到 Amazon S3 中。

# 在 Amazon S3 中查找查询输出文件
<a name="querying-finding-output-files"></a>

查询输出文件存储在采用以下路径模式的 Amazon S3 子文件夹中，除非在其配置覆盖了客户端设置的工作组中进行查询。当工作组配置覆盖客户端设置时，查询将使用工作组指定的结果路径。

```
QueryResultsLocationInS3/[QueryName|Unsaved/yyyy/mm/dd/]
```
+ *QueryResultsLocationInS3* 是由工作组设置或客户端设置指定的查询结果位置。有关更多信息，请参阅本文后面的[指定查询结果位置](query-results-specify-location.md)。
+ 以下子文件夹仅为从控制台运行且工作组配置未覆盖其结果路径的查询而创建。从 AWS CLI 或使用 Athena API 运行的查询将直接保存到 *QueryResultsLocationInS3*。
  + *QueryName* 是要保存其结果的查询的名称。如果查询已运行但未保存，则使用 `Unsaved`。
  + *yyyy/mm/dd* 是查询运行的日期。

与 `CREATE TABLE AS SELECT` 查询关联的文件存储在以上模式的 `tables` 子文件夹中。

## 识别查询输出文件
<a name="querying-identifying-output-files"></a>

查询输出文件会按照查询名称、查询 ID 和查询运行日期保存到 Amazon S3 中的查询结果位置。每个查询的文件都使用 *QueryID* 命名，这是在每个查询运行时 Athena 为其分配的唯一标识符。

会保存以下文件类型：


| 文件类型 | 文件命名模式 | 说明 | 
| --- | --- | --- | 
|  **查询结果文件**  |  `QueryID.csv` `QueryID.txt`  |  DML 查询结果文件以逗号分隔值 (CSV) 格式保存。 DDL 查询结果保存为纯文本文件。 您可以在使用控制台时从控制台的 **Results**（结果）窗格下载这些文件，也可以从查询 **History**（历史记录）中下载。有关更多信息，请参阅 [使用 Athena 控制台下载查询结果文件](saving-query-results.md)。  | 
|  **查询元数据文件**  |  `QueryID.csv.metadata` `QueryID.txt.metadata`  |  DML 和 DDL 查询元数据文件以二进制格式保存，无法人为读取。文件扩展名对应于相关的查询结果文件。Athena 在使用 `GetQueryResults` 操作读取查询结果时会使用元数据。虽然可以删除这些文件，但我们不建议这样做，因为这样会丢失关于查询的重要信息。  | 
|  **数据清单文件**  |  `QueryID-manifest.csv`  |  生成数据清单文件以跟踪当 [INSERT INTO](insert-into.md) 查询运行时 Athena 在 Amazon S3 数据源位置创建的文件。如果查询失败，清单也将跟踪查询要写入的文件。清单对于识别由于查询失败而导致的孤立文件很有用。  | 

## 使用 AWS CLI 标识查询输出位置和文件
<a name="querying-finding-output-files-cli"></a>

要使用 AWS CLI 标识查询输出位置和结果文件，请运行 `aws athena get-query-execution` 命令，如以下示例所示。用查询 ID 替换 *abc1234d-5efg-67hi-jklm-89n0op12qr34*。

```
aws athena get-query-execution --query-execution-id abc1234d-5efg-67hi-jklm-89n0op12qr34
```

该命令返回的输出类似于下方内容。有关每个输出参数的说明，请参阅 *AWS CLI 命令参考*中的 [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html)。

```
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1565649050.175,
            "State": "SUCCEEDED",
            "CompletionDateTime": 1565649056.6229999
        },
        "Statistics": {
            "DataScannedInBytes": 5944497,
            "DataManifestLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34-manifest.csv",
            "EngineExecutionTimeInMillis": 5209
        },
        "ResultConfiguration": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_S3"
            },
            "OutputLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34"
        },
        "QueryExecutionId": "abc1234d-5efg-67hi-jklm-89n0op12qr34",
        "QueryExecutionContext": {},
        "Query": "INSERT INTO mydb.elb_log_backup SELECT * FROM mydb.elb_logs LIMIT 100",
        "StatementType": "DML",
        "WorkGroup": "primary"
    }
}
```