

# 创建表
<a name="tables-described"></a>

尽管运行爬网程序是清点数据存储中数据的推荐方法，但您也可以手动将元数据表添加到 AWS Glue Data Catalog 中。通过这种方法，您可以更好地控制元数据定义，并根据您的特定要求对其进行自定义。

您可以通过以下方式向 Data Catalog 中添加表：
+ 使用 AWS Glue 控制台在 AWS Glue Data Catalog 中手动创建一个表。有关更多信息，请参阅 [使用控制台创建表](#console-tables)。
+ 在 [AWS Glue API](aws-glue-api.md) 中使用 `CreateTable` 操作在 AWS Glue Data Catalog 中创建表。有关更多信息，请参阅 [CreateTable 操作（Python：create\_table）](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-CreateTable)。
+ 使用 CloudFormation 模板。有关更多信息，请参阅 [AWS Glue 的 AWS CloudFormation](populate-with-cloudformation-templates.md)。

当您使用控制台或 API 手动定义表时，您需要指定表架构和分类字段的值（指示数据源中数据的类型和格式）。如果爬网程序创建表，则数据格式和架构由内置分类器或自定义分类器确定。有关使用 AWS Glue 控制台创建表的更多信息，请参阅[使用控制台创建表](#console-tables)。

**Topics**
+ [表分区](#tables-partition)
+ [表资源链接](#tables-resource-links)
+ [使用控制台创建表](#console-tables)
+ [创建分区索引](partition-indexes.md)
+ [使用爬网程序更新手动创建的数据目录表](#update-manual-tables)
+ [数据目录表属性](#table-properties)

## 表分区
<a name="tables-partition"></a>

Amazon Simple Storage Service（Amazon S3）文件夹的 AWS Glue 表定义可以描述分区表。例如，要提高查询性能，分区表可以使用月份的名称作为键将每月数据分隔为不同的文件。在 AWS Glue 中，表定义包含表的分区键。当 AWS Glue 评估 Amazon S3 文件夹中的数据以编目表时，它确定是否添加了单个表或分区表。

您可以在表上创建分区索引以获取分区的子集，而不是加载表中的所有分区。有关使用分区索引的信息，请参阅[创建分区索引](partition-indexes.md)。

以下 AWS Glue 所有条件都必须为 true，才能为 Amazon S3 文件夹创建分区表：
+ 文件的架构类似，由 AWS Glue 确定。
+ 文件的数据格式是相同的。
+ 文件的压缩格式是相同的。

例如，您可能拥有一个名为 `my-app-bucket` 的 Amazon S3 存储桶，在其中您存储了 iOS 和 Android 应用程序销售数据。该数据按年、月和日分区。适用于 iOS 和 Android 销售的数据文件具有相同的架构、数据格式和压缩格式。在 AWS Glue Data Catalog 中，AWS Glue 爬网程序使用年、月和日的分区键创建一个表定义。

`my-app-bucket` 的以下 Amazon S3 列表显示某些分区。`=` 符号用于分配分区键值。

```
   my-app-bucket/Sales/year=2010/month=feb/day=1/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=1/Android.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/Android.csv
   ...
   my-app-bucket/Sales/year=2017/month=feb/day=4/iOS.csv
   my-app-bucket/Sales/year=2017/month=feb/day=4/Android.csv
```

## 表资源链接
<a name="tables-resource-links"></a>


|  | 
| --- |
| AWS Glue 控制台最近已更新。当前版本的控制台不支持表资源链接。 | 

数据目录还可以包含表*资源链接*。表资源链接是指向本地或共享表的链接。目前，您只能在 AWS Lake Formation 中创建资源链接。创建到表的资源链接后，您可以在需要使用表名称的任何位置使用资源链接名称。与您拥有的或与您共享的表一起，表资源链接由 `glue:GetTables()` 返回，并在 AWS Glue 控制台的**表**页面上显示为条目。

数据目录还可以包含数据库资源链接。

有关资源链接的更多信息，请参阅《AWS Lake Formation 开发人员指南》**中的[创建资源链接](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-resource-links.html)。

## 使用控制台创建表
<a name="console-tables"></a>

AWS Glue Data Catalog中的表是表示数据存储中的数据的元数据定义。您可以在运行爬网程序时创建表，也可以在 AWS Glue 控制台中手动创建表。AWS Glue 控制台中的 **Tables (表)** 列表显示表的元数据值。您可以在创建 ETL (提取、转换和加载) 作业时使用表定义来指定源和目标。

**注意**  
随着最近对 AWS 管理控制台的更改，您可能需要修改现有的 IAM 角色才能获得 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables) 权限。对于创建新角色，已将 `SearchTables` API 权限添加为默认。

要查看现有任务，请登录 AWS 管理控制台 并通过以下网址打开 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。选择 **Tables** (表) 选项卡，然后使用 **Add tables** (添加表) 按钮来通过爬网程序或通过手动键入属性来创建表。

### 在控制台上添加表
<a name="console-tables-add"></a>

要使用爬网程序添加表，请依次选择 **Add tables** (添加表) 和 **Add tables using a crawler** (使用爬网程序添加表)。然后按照 **Add crawler** (添加爬网程序) 向导中的说明操作。当爬网程序运行时，会将表添加到 AWS Glue Data Catalog。有关更多信息，请参阅 [使用爬网程序填充 Data Catalog](add-crawler.md)。

如果您知道在数据目录中创建 Amazon Simple Storage Service（Amazon S3）表定义所需的属性，则可以使用表向导创建它。请依次选择 **Add tables** (添加表) 和 **Add table manually** (手动添加表)，然后按照 **Add tables** (添加表) 向导中的说明操作。

在通过控制台手动添加表时，请考虑以下各项：
+ 如果您计划从 Amazon Athena 访问表，请提供只包含字母数字和下划线字符的名称。有关更多信息，请参阅 [Athena 名称](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#ate-table-database-and-column-names-allow-only-underscore-special-characters)。
+ 源数据的位置必须是 Amazon S3 路径。
+ 数据的数据格式必须与向导中列出的格式之一匹配。将基于所选的格式自动填充相应的分类、SerDe 和其他表属性。您可以使用以下格式定义表：  
**Avro**  
Apache Avro JSON 二进制格式。  
**CSV**  
字符分隔值。您还可以指定逗号、竖线、分号、制表符或 Ctrl-A 等分隔符。  
**JSON**  
JavaScript 对象表示法。  
**XML**  
可扩展标记语言格式。指定定义数据中行的 XML 标签。在行标签中定义列。  
**Parquet**  
Apache Parquet 列式存储。  
**ORC**  
优化的行列式（ORC）格式。一种旨在高效存储 Hive 数据的格式。
+ 您可以为表定义分区键。
+ 目前，使用控制台创建的分区表不能用于 ETL 任务。

### 表属性
<a name="console-tables-attributes"></a>

以下是表的一些重要属性：

**名称**  
在创建表时确定名称，并且您无法更改它。您在许多 AWS Glue 操作中引用表名称。

**数据库**  
表所在的容器对象。此对象包含 AWS Glue Data Catalog中存在的表组织，并且可能与您的数据存储中的组织不同。当您删除数据库时，也会从数据目录中删除数据库中包含的所有表。

**说明**  
表的描述。您可以编写描述以帮助您了解表的内容。

**表格式**  
指定创建标准 AWS Glue 表或 Apache Iceberg 格式的表。  
Data Catalog 提供以下表优化选项，以管理表存储并提高 Iceberg 表的查询性能。  
+ **压缩** – 此功能会合并和重写数据文件以移除过时数据，并将碎片数据合并到更大、更高效的文件中。
+ **快照保留** – 快照是带有时间戳的 Iceberg 表版本。借助快照保留配置，客户可以强制规定快照保留期限和要保留的快照数量。配置快照保留优化器可以移除不必要的旧快照及其相关底层文件，从而帮助管理存储开销。
+ **孤立文件删除** – 孤立文件是指不再被 Iceberg 表元数据引用的文件。这些文件可能会逐渐堆积，尤其是在表删除或 ETL 任务失败等操作之后。启用孤立文件删除功能后，AWS Glue 会定期识别并移除这些不必要的文件，从而释放存储空间。
有关更多信息，请参阅 [优化 Iceberg 表](table-optimizers.md)。

**优化配置**  
您可以通过使用默认设置或对设置进行自定义来启用表优化器。

**IAM 角色**  
 为了运行表优化器，该服务会代表您代入一个 IAM 角色。您可以使用下拉列表选择一个 IAM 角色。确保该角色具有启用压缩所需的权限。  
要了解该 IAM 角色所需的权限，请参阅 [表优化的先决条件](optimization-prerequisites.md)。

**位置**  
指向此表定义表示的数据存储中的数据位置的指针。

**分类**  
在创建表时提供的分类值。通常，在爬网程序运行并指定源数据格式时写入它。

**上次更新时间**  
在数据目录中更新此表的日期和时间（UTC）。

**日期已添加**  
此表添加到数据目录中的日期和时间（UTC）。

**已弃用**  
如果 AWS Glue 发现数据目录中的表不再存在于其原始数据存储中，则会在数据目录中将此表标记为已淘汰。如果您运行的作业引用已淘汰的表，则此作业可能会失败。编辑引用已淘汰的表的作业，以从源和目标中删除这些表。我们建议您删除不再需要的已淘汰的表。

**Connection**  
如果 AWS Glue 需要连接到您的数据存储，则连接的名称与表相关联。

### 查看和管理表详细信息
<a name="console-tables-details"></a>

要查看现有表的详细信息，请在列表中选择表名称，然后选择 **Action, View details** (操作 -> 查看详细信息)。

表详细信息包括表的属性和架构。此视图显示表的架构，包括按为表定义的顺序排列的列名称、数据类型和分区的键列。如果列是复杂类型，您可以选择 **View properties** (查看属性) 来显示该字段的结构的详细信息，如以下示例所示：

```
{
"StorageDescriptor": 
    {
      "cols": {
         "FieldSchema": [
           {
             "name": "primary-1",
             "type": "CHAR",
             "comment": ""
           },
           {
             "name": "second ",
             "type": "STRING",
             "comment": ""
           }
         ]
      },
      "location": "s3://aws-logs-111122223333-us-east-1",
      "inputFormat": "",
      "outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
      "compressed": "false", 
      "numBuckets": "0",
      "SerDeInfo": {
           "name": "",
           "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
           "parameters": {
               "separatorChar": "|"
            }
      },
      "bucketCols": [],
      "sortCols": [],
      "parameters": {},
      "SkewedInfo": {},
      "storedAsSubDirectories": "false"
    },
    "parameters": {
       "classification": "csv"
    }
}
```

有关表的属性的更多信息，如 `StorageDescriptor`，请参阅 [StorageDescriptor 结构](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-StorageDescriptor)。

要更改表的架构，请选择 **Edit schema** (编辑架构) 来添加和删除列、更改列名称以及更改数据类型。

 要比较不同版本的表，包括其架构，请选择 **Compare versions** (比较版本) 来查看表架构的两个版本之间的逐项对照比较。有关更多信息，请参阅 [比较表架构版本](#console-tables-schema-comparison)。

要显示组成 Amazon S3 分区的文件，请选择 **View partition (查看分区)**。对于 Amazon S3 表，**Key (键)** 列显示用于对源数据存储中的表进行分区的分区键。分区是根据键列（如日期、位置或部门）的值将表划分为多个相关部分的方法。有关分区的更多信息，请在 Internet 上搜索有关“hive 分区”的信息。

**注意**  
要获取查看表详细信息的分步指导，请参阅控制台中的 **Explore table** (浏览表) 教程。

### 比较表架构版本
<a name="console-tables-schema-comparison"></a>

 比较两个版本的表架构时，可以通过展开和折叠嵌套行来比较嵌套行更改，并排比较两个版本的架构，并排查看表属性。

 要比较版本，请执行以下操作。

1.  在 AWS Glue 控制台中选择**表**，然后选择**操作**，再选择**比较版本**。  
![屏幕截图显示选中时的“操作”按钮。下拉菜单显示比较版本选项。](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/catalog-table-compare-versions.png)

1.  通过选择版本下拉菜单来选择要比较的版本。比较架构时，架构选项卡突出显示为橙色。

1.  比较两个版本之间的表时，将在屏幕的左侧和右侧分别显示表架构。便于您通过并排比较列名称、数据类型、键和注释字段来直观地确定更改。对于有更改的地方，彩色图标会显示所做更改的类型。
   +  已删除：红色图标表示该列已从先前版本的表架构中删除。
   +  已编辑或移动：蓝色图标表示在较新版本的表架构中被修改或移动的列。
   +  已添加：绿色图标表示被添加到新版表架构中的列。
   +  嵌套更改：黄色图标表示包含更改的嵌套列。选择要展开的列并查看已删除、编辑、移动或添加的列。  
![屏幕截图显示了两个版本之间的表架构比较。左侧是旧版本。右侧是较新的版本。删除图标位于从旧版本中删除的列旁边，该列已不在较新版本中。](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/catalog-table-version-comparison.png)

1.  使用筛选字段搜索栏根据您在此处输入的字符显示字段。如果您在任一表版本中输入列名，筛选后的字段将显示在两个表版本中，以显示发生更改的位置。

1.  要比较属性，请选择**属性**选项卡。

1.  要停止比较版本，请选择**停止比较**返回表列表。

## 使用爬网程序更新手动创建的数据目录表
<a name="update-manual-tables"></a>

您可能需要手动创建 AWS Glue Data Catalog 表，然后将它们保持为通过 AWS Glue 爬网程序进行更新。按计划运行的爬网程序可以添加新分区，并使用任何架构更改来更新表。这同样适用于从 Apache Hive 元存储中迁移的表。

要执行此操作，当您定义爬网程序时，不是指定一个或多个数据存储作为爬取源，而是指定一个或多个现有数据目录表。然后，爬网程序爬取由目录表指定的数据存储。在这种情况下，不会创建新表；而是更新手动创建的表。

以下是您可能需要手动创建目录表并将目录表指定为爬网程序源的其他原因：
+ 您想要选择目录表名称，但不依赖于目录表命名算法。
+ 在将其格式可能损坏分区检测的文件错误地保存在数据源路径的情况下，您可能希望阻止创建新表。

有关更多信息，请参阅 [步骤 2：选择数据源和分类器](define-crawler-choose-data-sources.md)。

## 数据目录表属性
<a name="table-properties"></a>

 AWS CLI 中已知的表属性或参数是未经验证的键值字符串。您可以在表上设置自己的属性，以支持在 AWS Glue 之外使用数据目录。其他使用数据目录的服务也可以执行该操作。AWS Glue 会在运行作业或爬网程序时设置一些表属性。除非另有说明，否则这些属性仅供内部使用，我们不支持它们继续以其当前形式存在，也不支持手动更改这些属性的产品行为。

 更多有关 AWS Glue 爬网程序设置的表属性的信息，请参阅 [爬网程序在数据目录表上设置的参数](table-properties-crawler.md)。