

# 填充和管理事务表
<a name="populate-otf"></a>

[Apache Iceberg](https://iceberg.apache.org/)、[Apache Hudi](https://hudi.incubator.apache.org/) 和 Linux Foundation [Delta Lake](https://delta.io/) 是开源表格式，专为 Apache Spark 中的大规模数据分析和数据湖工作负载而设计。

您可以使用以下方法在 AWS Glue Data Catalog 中填充 Iceberg、Hudi 和 Delta Lake 表：
+ AWS Glue 爬网程序 – AWS Glue 爬网程序 可以自动发现 Iceberg、Hudi 和 Delta Lake 表元数据并在 Data Catalog 中填充这些数据。有关更多信息，请参阅 [使用爬网程序填充 Data Catalog](add-crawler.md)。
+ AWS Glue ETL 任务 – 您可以创建 ETL 任务，以便将数据写入 Iceberg、Hudi 和 Delta Lake 表，并将其元数据填充到 Data Catalog 中。有关更多信息，请参阅 [Using data lake frameworks with AWS Glue ETL jobs](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-datalake-native-frameworks.html)。
+ AWS Glue 控制台、AWS Lake Formation 控制台、AWS CLI 或 API – 您可以使用 AWS Glue 控制台、Lake Formation 控制台或 API 在 Data Catalog 中创建和管理 Iceberg 表定义。

**Topics**
+ [创建 Apache Iceberg 表](#creating-iceberg-tables)
+ [优化 Iceberg 表](table-optimizers.md)
+ [优化 Iceberg 表的查询性能](iceberg-column-statistics.md)

## 创建 Apache Iceberg 表
<a name="creating-iceberg-tables"></a>

您可以使用驻留在 Amazon S3 中的数据在 AWS Glue Data Catalog 中创建使用 Apache Parquet 数据格式的 Apache Iceberg 表。该数据目录中的表是表示数据存储中数据的元数据定义。默认情况下，AWS Glue 会创建 Iceberg v2 表。有关 v1 和 v2 表之间的区别，请参阅 Apache Iceberg 文档中的[格式版本更改](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。

 [Apache Iceberg](https://iceberg.apache.org/) 是适用于超大型分析数据集的开放表格式。Iceberg 允许轻松更改架构，也称为架构发展，这意味着用户可以在不破坏基础数据的情况下添加、重命名或删除数据表中的列。Iceberg 还支持数据版本控制，允许用户跟踪数据随时间的变化。这将启用时间旅行功能，该功能允许用户访问和查询数据的历史版本，并分析更新和删除之间的数据更改。

您可以使用 AWS Glue 或 Lake Formation 控制台或 AWS Glue API 中的 `CreateTable` 操作在 Data Catalog 中创建 Iceberg 表。有关更多信息，请参阅 [CreateTable 操作 (Python: create\_table)](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-CreateTable)。

在数据目录中创建 Iceberg 表时，您必须在 Amazon S3 中指定表格式和元数据文件路径，以便能够执行读取和写入操作。

 当您向 AWS Lake Formation 注册 Amazon S3 数据位置时，您可以使用 Lake Formation 通过精细访问控制权限来保护 Iceberg 表。对于 Amazon S3 中的源数据和未向 Lake Formation 注册的元数据，访问权限由 Amazon S3 和 AWS Glue 操作的 IAM 权限策略决定。有关更多信息，请参阅 [Managing permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-permissions.html)。

**注意**  
数据目录不支持创建分区和添加 Iceberg 表属性。

### 先决条件
<a name="iceberg-prerequisites"></a>

 要在数据目录中创建 Iceberg 表并设置 Lake Formation 数据访问权限，您需要完成以下要求：

1. 

**在没有向 Lake Formation 注册数据的情况下创建 Iceberg 表所需的权限。**

   除了在数据目录中创建表所需的权限外，表创建者还需要以下权限：
   + 针对资源 arn:aws:s3:::\{bucketName\} 的 `s3:PutObject`
   + 针对资源 arn:aws:s3:::\{bucketName\} 的 `s3:GetObject`
   + 针对资源 arn:aws:s3:::\{bucketName\} 的 `s3:DeleteObject`

1. 

**使用向 Lake Formation 注册的数据创建 Iceberg 表所需的权限：**

   要使用 Lake Formation 管理和保护数据湖中的数据，请向 Lake Formation 注册包含表数据的 Amazon S3 位置。这样，Lake Formation 就可以向 Athena、Redshift Spectrum 和 Amazon EMR 等 AWS 分析服务提供凭证以访问数据。有关注册 Amazon S3 位置的更多信息，请参阅 [Adding an Amazon S3 location to your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。

   读取和写入向 Lake Formation 注册的基础数据的主体需要以下权限：
   + `lakeformation:GetDataAccess`
   + `DATA_LOCATION_ACCESS`

     对某个位置具有数据位置权限的主体也对所有子位置具有位置权限。

     有关数据位置权限的更多信息，请参阅 [Underlying data access control](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html#data-location-permissions) Ulink。

 要启用压缩，该服务需要代入有权更新数据目录中的表的 IAM 角色。有关详细信息，请参阅 [表优化的先决条件](optimization-prerequisites.md) 

### 创建 Iceberg 表
<a name="create-iceberg-table"></a>

您可以使用 AWS Glue 或 Lake Formation 控制台或 AWS Command Line Interface 创建 Iceberg v1 和 v2 表，如本页所述。您也可以使用 AWS Glue 爬网程序 创建 Iceberg 表。有关更多信息，请参阅《AWS Glue 开发人员指南》中的[数据目录和爬网程序](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。

**创建 Iceberg 表**

------
#### [ Console ]

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在数据目录下，选择**表**，然后使用**创建表**按钮指定以下属性：
   + **表名称** – 输入表的唯一名称。如果您使用 Athena 访问表，请使用《Amazon Athena 用户指南》中的这些[命名提示](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html)。
   + **数据库** – 选择现有数据库或创建新数据库。
   + **描述** – 表的描述。您可以编写描述以帮助您了解表的内容。
   + **表格式** – 对于**表格式**，请选择 Apache Iceberg。
   + **启用压缩** – 选择**启用压缩**，将表中较小的 Amazon S3 对象压缩成较大对象。
   + **IAM 角色** – 为了运行压缩，该服务会代表您代入一个 IAM 角色。您可以使用下拉列表选择一个 IAM 角色。确保该角色具有启用压缩所需的权限。

     要了解有关所需权限的更多信息，请参阅[表优化的先决条件](optimization-prerequisites.md)。
   + **位置** – 指定 Amazon S3 中存储元数据表的文件夹的路径。Iceberg 需要数据目录中的元数据文件和位置才能执行读取和写入。
   + **架构** – 选择**添加列**以添加列和列的数据类型。您可以选择创建一个空表，然后稍后更新架构。数据目录支持 Hive 数据类型。有关更多信息，请参阅 [Hive 数据类型](https://cwiki.apache.org/confluence/plugins/servlet/mobile?contentId=27838462#content/view/27838462)。

      Iceberg 允许您在创建表后演变架构和分区。您可以使用 [Athena 查询](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-evolving-table-schema.html)更新表架构，使用 [Spark 查询](https://iceberg.apache.org/docs/latest/spark-ddl/#alter-table-sql-extensions)更新分区。

------
#### [ AWS CLI ]

```
aws glue create-table \
    --database-name iceberg-db \
    --region us-west-2 \
    --open-table-format-input '{
      "IcebergInput": { 
           "MetadataOperation": "CREATE",
           "Version": "2"
         }
      }' \
    --table-input '{"Name":"{{test-iceberg-input-demo}}",
            "TableType": "EXTERNAL_TABLE",
            "StorageDescriptor":{ 
               "Columns":[ 
                   {"Name":"col1", "Type":"int"}, 
                   {"Name":"col2", "Type":"int"}, 
                   {"Name":"col3", "Type":"string"}
                ], 
               "Location":"s3://{{DOC_EXAMPLE_BUCKET_ICEBERG}}/"
            }
        }'
```

------

**Topics**
+ [先决条件](#iceberg-prerequisites)
+ [创建 Iceberg 表](#create-iceberg-table)