

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

# 开始使用 Amazon Athena SQL 中的 Iceberg 表
<a name="getting-started"></a>

亚马逊 Athena 为 Iceberg 提供内置支持。除了设置 Athena 文档[入门](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)部分中详述的服务先决条件外，您无需任何其他步骤或配置即可使用 Iceberg。本节简要介绍如何在 Athena 中创建表格。有关更多信息，请参阅本指南后[面的使用 Athena SQL 处理 Iceberg 表](iceberg-athena.md)。

您可以使用不同的引擎在上 AWS 创建 Iceberg 表。这些表格可以无缝协作 AWS 服务。要使用 Athena SQL 创建你的第一个 Iceberg 表，你可以使用以下样板代码。

```
CREATE TABLE <table_name> (
    col_1 string,
    col_2 string,
    col_3 bigint,
    col_ts timestamp)
PARTITIONED BY (col_1, <<<partition_transform>>>(col_ts))
LOCATION 's3://<bucket>/<folder>/<table_name>/'
TBLPROPERTIES ( 
    'table_type' ='ICEBERG'
)
```

以下各节提供了在 Athena 中创建分区和未分区的 Iceberg 表的示例。有关更多信息，请参阅 At [hena](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-creating-tables.html#querying-iceberg-partitioning) 文档中详细介绍的 Iceberg 语法。

## 创建未分区的表
<a name="unpartitioned-table"></a>

以下示例语句自定义样板 SQL 代码，以在 Athena 中创建未分区的 Iceberg 表。您可以将此语句添加到 [Athena](https://console.aws.amazon.com/athena/) 控制台的查询编辑器中以创建表。

```
CREATE TABLE athena_iceberg_table (
    color string,
    date string,
    name string,
    price bigint,
    product string,
    ts timestamp)
LOCATION 's3://DOC_EXAMPLE_BUCKET/ice_warehouse/iceberg_db/athena_iceberg_table/'
TBLPROPERTIES ( 
    'table_type' ='ICEBERG'
)
```

有关使用查询编辑器的 step-by-step说明，请参阅 Athena 文档中的[入门](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)。

## 创建分区表
<a name="partitioned-table"></a>

以下语句使用 Iceberg 的[隐藏](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)分区概念根据日期创建分区表。它使用`day()`转换从时间戳列中派生出每日分区（使用`dd-mm-yyyy`格式）。Iceberg 不会将此值存储为数据集中的新列。相反，该值是在您写入或查询数据时即时派生的。

```
CREATE TABLE athena_iceberg_table_partitioned (
    color string,
    date string,
    name string,
    price bigint,
    product string,
    ts timestamp)
PARTITIONED BY (day(ts))
LOCATION 's3://DOC_EXAMPLE_BUCKET/ice_warehouse/iceberg_db/athena_iceberg_table/'
TBLPROPERTIES ( 
    'table_type' ='ICEBERG'
)
```

## 使用单个 CTAS 语句创建表并加载数据
<a name="ctas-statement"></a>

在前几节的分区和未分区示例中，Iceberg 表创建为空表。您可以使用`INSERT `或`MERGE`语句将数据加载到表中。或者，您可以使用`CREATE TABLE AS SELECT (CTAS)`语句在单个步骤中创建数据并将其加载到 Iceberg 表中。

CTAS 是 Athena 中创建表并在单个语句中加载数据的最佳方式。以下示例说明如何使用 CTAS 从 Athena 中的现有表 (`iceberg_ctas_table`) 创建 Iceberg Hive/Parquet 表 (`hive_table`)。

```
CREATE TABLE iceberg_ctas_table WITH (
  table_type = 'ICEBERG',
  is_external = false,
  location = 's3://DOC_EXAMPLE_BUCKET/ice_warehouse/iceberg_db/iceberg_ctas_table/'
) AS
SELECT * FROM "iceberg_db"."hive_table" limit 20
---
SELECT * FROM "iceberg_db"."iceberg_ctas_table" limit 20
```

要了解有关 CTAS 的更多信息，请参阅 [Athena](https://docs.aws.amazon.com/athena/latest/ug/ctas.html) CTAS 文档。

## 插入、更新和删除数据
<a name="updating-data"></a>

Athena 支持使用`UPDATE`、`MERGE INTO`、和 M 语句将数据写入 Iceberg 表`INSERT INTO`的不同方式。`DELETE FRO`

**注意**  
Athena SQL 目前不支持这种方法。 copy-on-write `UPDATE``MERGE INTO`、和`DELETE FROM`操作始终使用位置删除 merge-on-read的方法，无论指定的表属性如何。如果您设置了诸如`write.update.mode`、和`write.delete.mode`之类的表属性`write.merge.mode`，则查询不会失败 copy-on-write，但是 Athena 会忽略这些属性并继续使用。 merge-on-read

以下语句用于`INSERT INTO`向 Iceberg 表添加数据：

```
INSERT INTO "iceberg_db"."ice_table" VALUES (
    'red', '222022-07-19T03:47:29', 'PersonNew', 178, 'Tuna', now()
)

SELECT * FROM "iceberg_db"."ice_table"
where color = 'red' limit 10;
```

示例输出：

![\[来自 INSERT 语句的示例输入\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/apache-iceberg-on-aws/images/insert-into-output.png)


有关更多信息，请参阅 [Athena 文档。](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-updating-iceberg-table-data.html)

## 查询冰山表
<a name="querying-iceberg-tables"></a>

您可以使用 Athena SQL 对您的 Iceberg 表运行常规 SQL 查询，如前面的示例所示。

除了通常的查询外，Athena 还支持对 Iceberg 表进行时空旅行查询。如前所述，您可以通过更新或删除 Iceberg 表来更改现有记录，因此可以方便地使用时空旅行查询根据时间戳或快照 ID 回顾表的旧版本。

例如，以下语句更新了的颜色值`Person5`，然后显示自 2023 年 1 月 4 日起的较早值：

```
UPDATE ice_table SET color='new_color' WHERE name='Person5'

SELECT * FROM "iceberg_db"."ice_table" FOR TIMESTAMP AS OF TIMESTAMP '2023-01-04 12:00:00 UTC'
```

示例输出：

![\[冰山时空旅行查询的输出示例\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/apache-iceberg-on-aws/images/time-travel-output.png)


有关时空旅行查询的语法和其他示例，请参阅 [Athena 文档](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-table-data.html#querying-iceberg-time-travel-and-version-travel-queries)。

## 冰山桌解剖图
<a name="iceberg-table-anatomy"></a>

现在我们已经介绍了使用 Iceberg 桌子的基本步骤，让我们更深入地了解冰山桌子错综复杂的细节和设计。

为了启用本指南[前面描述](data-lakes.md#iceberg-intro)的功能，Iceberg 设计了数据和元数据文件的分层结构。这些层可以智能地管理元数据，以优化查询计划和执行。

下图通过两个角度描绘了 Iceberg 表的组织结构： AWS 服务 用于存储表的视角和文件在 Amazon S3 中的位置。

![\[冰山桌子的剖析\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/apache-iceberg-on-aws/images/iceberg-table-anatomy.png)


如图所示，冰山表由三个主要层组成：
+ **Iceberg 目录**： AWS Glue Data Catalog 与 Iceberg 原生集成，对于大多数用例来说，它是运行的工作负载的最佳选择。 AWS与 Iceberg 表交互的服务（例如 Athena）使用目录来查找表的当前快照版本，以读取或写入数据。
+ **元数据层**：元数据文件，即清单文件和清单列表文件，用于跟踪表架构、分区策略和数据文件位置等信息，以及列级统计信息，例如存储在每个数据文件中的记录的最小和最大范围。这些元数据文件存储在 Amazon S3 中的表路径中。
  + **清单文件**包含每个数据文件的记录，包括其位置、格式、大小、校验和和其他相关信息。
  + **清单列表**提供了清单文件的索引。随着表中清单文件数量的增加，将这些信息分成较小的子部分有助于减少查询需要扫描的清单文件数量。
  + **元数据文件**包含有关整个 Iceberg 表的信息，包括清单列表、架构、分区元数据、快照文件和其他用于管理表元数据的文件。
+ **数据层**：该层包含包含查询将针对的数据记录的文件。[这些文件可以以不同的格式存储，包括 Apache Par [quet、Apache](https://parquet.apache.org/)[Avro 和 Apache](https://avro.apache.org/) ORC。](https://orc.apache.org/)
  + **数据文件**包含表的数据记录。
  + **删除文件在 I** ceberg 表中对行级删除和更新操作进行编码。Iceberg 有两种类型的删除文件，如 [Iceberg](https://iceberg.apache.org/spec/#delete-formats) 文档中所述。这些文件是使用 merge-on-read模式通过操作创建的。