

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解导出交付
<a name="dataexports-export-delivery"></a>

在以下部分中，您将找到有关导出交付的信息。
+ **导出 S3 父目录结构：**导出数据在导出交付到的 S3 目录中的构造方式。
+ **导出刷新：**导出在 S3 目录中更新的频率。
+ **导出覆盖和新建：**导出交付如何随覆盖而发生更改并创建新的交付首选项。
+ **导出数据文件名和块：**导出文件（gzip/csv 或 Parquet）的命名方式。

## 导出 S3 父目录结构
<a name="export-s3-parent-directory-structure"></a>

每次导出都会将查询中的数据传送到 S3（作为一个或多个 gzip/csv 或 Parquet 文件），以及一个`Manifest.json`元数据文件，其中包含执行导出时有关导出定义的信息。

**数据**  
导出查询生成的数据存储在以下 S3 文件路径中：  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/`  
该分区对应于正在查询的表。对于 CUR 2.0，该分区对应于给定 CUR 2.0 导出的“账单周期”。  
`prefix`：分配给导出的 S3 文件前缀。  
`export-name`：分配给导出的名称。  
`partition`：该分区描述如何将单个表分区为单独的表以进行交付。对于 CUR 2.0，该分区对应于采用 `BILLING_PERIOD=YYYY-MM` 格式的“账单周期”。例如，2023 年 11 月的分区为 2023-11。  
以下是 S3 文件路径的示例：  
`s3://my-data-export-s3-bucket/my-cur-files/business_group_a_cur/data/BILLING_PERIOD=2023-11`

**元数据**  
查询的 `Manifest.json` 元数据文件存储在以下 S3 文件路径中：  
`s3://<bucket-name>/<prefix>/<export-name>/metadata/<partition>/<export-name>-Manifest.json`  
每次刷新导出时都会更新 `Manifest.json` 文件。将为导出创建的每个新分区创建一个新的 `Manifest.json` 文件。对于 CUR 2.0，这意味着在新的账单周期开始时会生成一个新的 `Manifest.json` 文件。  
清单文件包含以下信息：  
+ 导出中包含的所有列。
+ 导出文件及其文件路径的列表。建议通过以编程方式读取此列表来确定要提取的文件。
+ 导出所涵盖的时间段。
+ 名为的部分列`additionalOutputFiles`出了如果您集成了 Athena 或 Amazon Redshift，则会交付的其他文件。
`Manifest.json` 文件只有在将所有导出数据文件交付到 S3 后才会交付。

## 导出刷新
<a name="export-refreshing"></a>

每次更新源数据时，Data Exports 都会刷新您的导出。对于 CUR 2.0，这种情况每天至少发生一次。当前账单周期（分区）将刷新，直到账单周期结束，此时下一个账单周期的交付开始。下一个账单周期的交付仅包含该账单周期的费用和账单数据。账单周期结束后， AWS 可以在上一个账单周期结束后的前两周内更新该账单周期的出口交付。

## 导出覆盖和新建
<a name="export-overwriting-create-new"></a>

创建导出时，可以选择创建新的导出文件，也可以选择在每次刷新时覆盖现有导出文件。

**新建**  
创建新的导出文件会占用更多的 S3 存储空间，因为会保留所有导出刷新。覆盖之前的导出文件会占用较少的 S3 存储空间，因为只会保留每个账单周期刷新的最新版本。  
在“新建”模式下，导出文件将交付到以下 S3 路径：  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/<timestamp>-<execution-id>`  
`timestamp` 执行导出的日期和时间。`execution-id` 是分配给执行的唯一 ID。  
对于“新建”，每次导出执行时都会交付两个 `Manifest.json` 文件。一个存储在 `metadata/<partition>/<timestamp>-<execution-id>` 目录中，另一个则在 `metadata/<partition>` 目录中被覆盖。`metadata/<partition>` 目录中的清单始终代表最近的刷新，其数据用于标识最近刷新的导出文件的位置。

**覆盖**  
覆盖仅适用于同一分区（即账单周期）的刷新。新的账单周期开始后，导出会创建一个新的 S3 目录，其名称基于最新的分区或账单周期，然后开始在该目录交付新的导出分区。除非更新该特定分区的数据，否则不会覆盖上一个分区的导出。  
在“覆盖”模式下，导出文件将交付到以下 S3 路径：  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/`  
此文件目录中的导出文件在每次交付同一分区（即账单周期）时都会被覆盖。  
当导出文件变得足够大时，导出文件将作为多个 “块”（单独文件 gzip/csv 或 Parquet 文件）交付。如果当月导出的大小有所减小（由于查询更改或数据更正），则可能需要更少的数据块来交付导出刷新。在这种情况下，Data Exports 会用空数据覆盖上次刷新后的任何额外块。  
为进行覆盖，每次执行导出时都会交付一个 `Manifest.json` 文件。该文件存储在 `metadata/<partition>` 目录中并在每次刷新时被覆盖。

## 导出数据文件名和数据块
<a name="export-data-file-names"></a>

导出要么将一次执行的结果作为一个文件（gzip/csv 或 Parquet）提供，要么在导出变得足够大时以多个 “块”（单独 gzip/csv 或 Parquet 文件）的形式传送。

导出的 gzip/csv 文件格式命名如下：

`<export-name>-<chunk-number>.csv.gz`

对于 Parquet 格式，导出的命名方式如下：

`<export-name>-<chunk-number>.snappy.parquet`

数据块编号始终有五位数字。数据块编号从 `00001` 开始枚举。

**注意**  
如果你在创建 CUR 2.0 时选择了 Athena 或 Redshift 报告集成选项，那么下面关于 Redshift 和 Athena 集成的部分可能与你有关。

## 亚马逊 Redshift 集成
<a name="dataexports-redshift-specifications"></a>

如果您选择了 Amazon Redshift 集成选项，则 AWS 还会创建并提交一个包含将报告上传到亚马逊 Redshift 所需的 SQL 命令的文件。要将导出的数据上传到亚马逊 Redshift，请完成以下步骤。

**将数据导出到亚马逊 Redshift**

1. 创建一个 Amazon Redshift 集群。有关更多信息，请参阅《Amazon Redshift 管理指南》中的[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#create-cluster)。**

1. 登录 AWS 管理控制台并在上打开 Amazon S3 控制台[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 导航到您存储 AWS 数据导出内容的 Amazon S3 位置。

1. 下载存储在 S3 中的清单`RedshiftCommands.sql`文件旁边的文件，以及 Redshift 帮助程序文件，网址为：

   `<bucket>/<prefix>/<export-name>/metadata/<partition>/<export-name>-RedshiftCommands.sql`

1. 在`copy`命令中，`<AWS_ROLE>`替换为有权访问存储 AWS 数据导出的 Amazon S3 存储桶的 IAM 角色的 ARN。

1. `<S3_BUCKET_REGION>`替换为您的 Amazon S3 存储桶所在的区域。例如 `us-east-1`。

1. 使用 SQL 客户端连接到群集。有关更多信息，请参阅《Amazon Redshift 管理指南》中的[访问 Amazon Redshift 集群和数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/using-rs-tools.html)。**

1. 按以下顺序将 SQL 命令从 `RedshiftCommands.sql` 文件复制到您的 SQL 客户端：

   1. **创建表** — 创建一个 Amazon Redshift 表，其架构经过自定义以匹配您的报告。

   1. **复制** — 使用提供的 IAM 角色将 AWS 数据导出文件从 S3 上传到 Amazon Redshift。

   1. **创建标签表**-创建一个表，允许您将定义的标签映 AWS射到用户定义的标签。

   1. **insert-将用户定义的标签插入**标签表。

1. 将数据导出中的所有数据复制到 Amazon Redshift 后，您可以使用 SQL 查询数据。 AWS 有关更多信息，请参阅《[亚马逊 Redshift 数据库开发者指南》中的*亚马逊 Redshift* SQL](https://docs.aws.amazon.com/redshift/latest/dg/c_redshift-sql.html)。

## 亚马逊 Athena 集成
<a name="dataexports-athena-specifications"></a>

如果您选择了 Amazon Athena 集成选项 AWS ，则还会创建和交付多个文件以帮助设置所需的所有资源。 AWS 提供了一个 CloudFormation 模板、一个用于手动创建 Athena 表的 SQL 文件和一个用于检查导出刷新状态的状态文件夹。这些文件使用以下命名约定。

CloudFormation 用于设置 Athena 资源的模板：

`<prefix>/<export-name>/crawler-cfn.yml`

用于手动创建 Athena 表的 SQL 文件：

`<prefix>/<export-name>/metadata/<partition>/<export-name>-create-table.sql`

导出刷新状态文件夹：

`<prefix>/<export-name>/execution_status/`

### 使用模板设置 Athena CloudFormation
<a name="dataexports-athena-cfn"></a>

**使用 Athena 模板 CloudFormation**

1. 导航到 S3 存储桶中的`crawler-cfn.yml`文件，然后选择对象 URL 旁边的**复制**按钮。

1. 打开 CloudFormation 控制台，网址为[https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/)。

1. 如果您 CloudFormation 以前从未使用过，请选择 “**创建新堆栈**”。否则，选择 **Create Stack (创建堆栈)**。

1. 在 “**准备模板**” 下，**选择 “选择现有模板**”。

1. 在 “**指定模板”** 下的 “**模板来源**” 中，选择 **Amazon S3 网址**。

1. 将 S3 对象网址粘贴到**亚马逊 S3 网址**框中。

1. 选择**下一步**。

1. 对于 **Stack name (堆栈名称)**，输入您的模板的名称，然后选择 **Next (下一步)**。

1. 在页面底部，选择**我确认， AWS CloudFormation 可能创建 IAM 资源**。

1. 选择**下一步**，然后选择**提交**。

**更新现有 Athena 模板 CloudFormation**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 从存储桶列表中，选择您选择接收 AWS 数据导出的存储桶。

1. 选择您的报告路径前缀 (`your-report-path-prefix/`)，然后选择您的报告名称 (`your-report-name/`)。

1. 选择`.yml`模板文件并选择对象 URL 旁边的 “**复制**” 按钮。

1. 打开 CloudFormation 控制台，网址为[https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/)。

1. 选择之前创建的堆栈，然后选择 “**更新堆栈**” > “**直接更新”**。

1. 在 “**准备模板**” 下，选择 “**替换现有模板**”。

1. 在 “**模板来源**” 下，选择 **Amazon S3 网址**。

1. 将 S3 对象网址粘贴到**亚马逊 S3 网址**框中。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页面上，修改所有详细信息，然后选择**下一步**。

1. 在页面底部，选择**我确认， AWS CloudFormation 可能创建 IAM 资源**。

1. 选择**下一步**，然后选择**提交**。

### 手动设置 Athena
<a name="dataexports-athena-manual"></a>

如果您不想使用该 CloudFormation 模板，则可以使用提供的 SQL 文件手动创建 Athena 表。

**手动创建 Athena 表**

1. 您的导出`create-table.sql`文件位于：

   `<bucket>/<prefix>/<export-name>/metadata/BILLING_PERIOD=YYYY-MM/<export-name>-create-table.sql`

1. 在 “**新建查询 1**” 查询窗格中，粘贴文件中的 SQL。对于`<database name>.<table name>`，请使用 SQL 第一行中的数据库和表名。

1. 运行以下命令来创建数据库：

   `CREATE DATABASE <database name>`

要加载新的报告分区，请运行以下 SQL：

`ALTER TABLE `<database name>`.<table name> ADD PARTITION (billing_period='YYYY-MM') LOCATION 's3://<bucket>/<prefix>/<export-name>/data/BILLING_PERIOD=YYYY-MM/';`其中 YYYY-MM ，以 4 位数年份和 2 位数月份表示的账单周期。例如 2026-05。

有关更多信息，请参阅使用 [Amazon Athena 查询成本和使用情况报告](https://docs.aws.amazon.com/cur/latest/userguide/cur-query-athena.html)。

## Summary
<a name="export-summary"></a>

**用于新建的带目录的导出数据文件名**  
Parquet：  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/<timestamp>-<execution-id>/<export-name>-<chunk-number>.snappy.parquet`  
gzip/csv:  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/<timestamp>-<execution-id>/<export-name>-<chunk-number>.csv.gz`

**用于覆盖的带目录的导出数据文件名**  
Parquet：  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/<export-name>-<chunk-number>.snappy.parquet`  
gzip/csv:  
`s3://<bucket-name>/<prefix>/<export-name>/data/<partition>/<export-name>-<chunk-number>.csv.gz`

**用于新建的带目录的清单文件名**  
“新建”模式会将 `Manifest.json` 交付到两个位置。  
第一个位置位于表示导出的特定执行的文件夹中（由 `timestamp` 和 `execution-id` 命名）。此清单文件对应于该特定执行。相应文件路径如下：  
`s3://<bucket-name>/<prefix>/<export-name>/metadata/<partition>/<timestamp>-<execution-id>`  
第二个位置位于包含所有执行的分区文件夹中。此清单文件与最近执行导出的文件相同。您可以读取此清单文件来标识所有最近导出文件的确切文件路径。相应文件路径如下：  
`s3://<bucket-name>/<prefix>/<export-name>/metadata/<partition>/Manifest.json`

**用于覆盖的带目录的清单文件名**  
“覆盖”模式会将 `Manifest.json` 交付到一个位置。  
`s3://<bucket-name>/<prefix>/<export-name>/metadata/<partition>`  
每次刷新给定分区（即账单周期），都会覆盖此目录中的清单文件。