

# 同步 Delta Lake 元数据
<a name="delta-lake-tables-syncing-metadata"></a>

如果您使用 Athena 创建 Delta Lake 表，Athena 会将表元数据（包括架构、分区列和表属性）同步到 Amazon Glue。随着时间推移，该元数据可能会中断与事务日志中基础表元数据的同步。要让表保持最新状态，您可以选择以下选项之一：
+ 为 Delta Lake 表使用 Amazon Glue 爬网程序。有关更多信息，请参阅 *Amazon 大数据博客*中的[带 Amazon Glue 爬网程序的原生 Delta Lake 表支持的简介](https://www.amazonaws.cn/blogs/big-data/introducing-native-delta-lake-table-support-with-aws-glue-crawlers/)和《Amazon Glue 开发人员指南》中的[计划 Amazon Glue 爬网程序](https://docs.amazonaws.cn/glue/latest/dg/schedule-crawler.html)。
+ 在 Athena 中删除并重新创建表格。
+ 使用 SDK、CLI 或 Amazon Glue 控制台手动更新 Amazon Glue 中的架构。

请注意：以下功能要求您的 Amazon Glue 架构始终具有与事务日志相同的架构：
+ Lake Formation
+ 视图
+ 行和列筛选器

如果您的工作流程不需要任何此功能，并且您不希望保持这种兼容性，则可以在 Athena 中使用 `CREATE TABLE` DDL，然后将 Amazon S3 路径作为 SerDe 参数添加到 Amazon Glue 中。

## 使用 Athena 和 Amazon Glue 控制台创建 Delta Lake 表
<a name="delta-lake-tables-syncing-metadata-console"></a>

您可以参考以下过程，使用 Athena 和 Amazon Glue 控制台创建 Delta Lake 表。

**使用 Athena 和 Amazon Glue 控制台创建 Delta Lake 表**

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

1. 在 Athena 查询编辑器中，使用以下 DDL 创建您的 Delta Lake 表。请注意：使用此方法时，`TBLPROPERTIES` 的值必须为 `'spark.sql.sources.provider' = 'delta'`，而不是 `'table_type' = 'delta'`。

   请注意：当您使用 Apache Spark（Athena for Apache Spark）或大多数其他引擎创建表时，会插入相同的架构（其中包含一个名为 `col` 的 `array<string>` 类型列）。

   ```
   CREATE EXTERNAL TABLE
      [db_name.]table_name(col array<string>)
      LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
      TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
   ```

1. 通过 [https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/) 打开 Amazon Glue 控制台。

1. 在导航窗格中，选择**数据目录**、**表**。

1. 在表的列表中，选择表的链接。

1. 在表格页面上，选择**操作**、**编辑表格**。

1. 在 **Serde 参数**部分，添加带有值 **s3://amzn-s3-demo-bucket/*your-folder*/** 的键 **path**。

1. 选择**保存**。

## 使用 Amazon CLI 创建 Delta Lake 表
<a name="delta-lake-tables-syncing-metadata-cli"></a>

要使用 Amazon CLI 创建 Delta Lake 表，请输入如下命令。

```
aws glue create-table --database-name dbname \
    --table-input '{"Name" : "tablename", "StorageDescriptor":{
            "Columns" : [
                {
                    "Name": "col",
                    "Type": "array<string>"
                }
            ],
            "Location" : "s3://amzn-s3-demo-bucket/<prefix>/",
            "SerdeInfo" : {
                "Parameters" : {
                    "serialization.format" : "1",
                    "path" : "s3://amzn-s3-demo-bucket/<prefix>/"
                }
            }
        },
        "PartitionKeys": [],
        "TableType": "EXTERNAL_TABLE",
        "Parameters": {
            "EXTERNAL": "TRUE",
            "spark.sql.sources.provider": "delta"
        }
    }'
```