

# 手动定义元数据
<a name="populate-dg-manual"></a>

 AWS Glue Data Catalog 是一个中央存储库，用于存储有关您的数据来源和数据集的元数据。虽然爬网程序可以自动爬取和填充支持的数据来源的元数据，但在某些情况下，您可能需要在 Data Catalog 中手动定义元数据：
+ 不支持的数据格式 – 如果您的数据来源不受爬网程序支持，则需要在 Data Catalog 中手动定义这些数据来源的元数据。
+ 自定义元数据要求 – AWS Glue 爬网程序 根据预定义的规则和约定推断元数据。如果您有 AWS Glue 爬网程序 推断元数据未涵盖的特定元数据要求，则可以手动定义元数据以满足您的需求 
+ 数据治理和标准化 – 在某些情况下，出于数据治理、合规性或安全原因，您可能需要对元数据定义拥有更多控制。通过手动定义元数据，您可以确保元数据符合组织的标准和政策。
+ 用于未来数据摄取的占位符 – 如果您的数据来源无法立即使用或无法立即访问，则可以创建空架构表作为占位符。数据来源可用后，您可以使用实际数据填充表，同时保持预定义的结构。

 要手动定义元数据，您可以使用 AWS Glue 控制台、Lake Formation 控制台、AWS Glue API 或 AWS Command Line Interface（AWS CLI）。您可以创建数据库、表和分区，并指定元数据属性，例如列名称、数据类型、描述和其他属性。

# 创建数据库
<a name="define-database"></a>

数据库用于组织 AWS Glue 中的元数据表。在 AWS Glue Data Catalog 中定义表时，您将其添加到数据库。表只能位于一个数据库中。

您的数据库可以包含定义来自很多不同数据存储的数据的表。此数据可以包括 Amazon Simple Storage Service（Amazon S3）中的对象和 Amazon Relational Database Service 中的关系表。

**注意**  
当您从 AWS Glue 数据目录中删除数据库时，也会删除数据库中的所有表。

 要查看数据库列表，请登录 AWS 管理控制台 并通过以下网址打开 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。选择 **Databases (数据库)**，然后在列表中选择一个数据库名称以查看详细信息。

 从 AWS Glue 控制台中的 **Databases (数据库)** 选项卡上，您可以添加、编辑和删除数据库。
+ 要创建新的数据库，请选择 **Add database (添加数据库)** 并提供名称和描述。为了与其他元数据存储 (如 Apache Hive) 兼容，名称会转换为小写字符。
**注意**  
如果您计划从 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)。
+  要编辑数据库的说明，请选中数据库名称旁边的复选框，然后选择 **Edit**（编辑）。
+  要删除数据库，请选中数据库名称旁边的复选框，然后选择 **Remove**（删除）。
+  要显示数据库中包含的表列表，请选择数据库名称，数据库属性将显示数据库中的所有表。

要更改爬网程序写入的数据库，必须更改爬网程序定义。有关更多信息，请参阅 [使用爬网程序填充 Data Catalog](add-crawler.md)。

## 数据库资源链接
<a name="databases-resource-links"></a>


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

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

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

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

# 创建表
<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\$1table）](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="partition-indexes"></a>

随着时间的推移，数十万个分区被添加到一个表中。[GetPartitions API](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html) 用于获取表中的分区。API 返回与请求中提供的表达式匹配的分区。

让我们以 *sales\$1data* 表为例，该表依据 *Country*、*Category*、*Year*、*Month* 和 *creationDate* 键进行分区。如果您想获得 2020 年 *2020-08-15* 以后 *Books* 类别所有已售出商品的销售数据，则必须使用表达式 "Category = 'Books' and creationDate > '2020-08-15'" 向数据目录发出 `GetPartitions` 请求。

如果表中没有分区索引，则 AWS Glue 加载表的所有分区，然后使用用户在 `GetPartitions` 请求中提供的查询表达式筛选加载的分区。随着没有索引的表上的分区数量的增加，查询需要更多的时间来运行。借助索引，`GetPartitions` 查询将尝试获取分区的子集，而不是加载表中的所有分区。

**Topics**
+ [关于分区索引](#partition-index-1)
+ [使用分区索引创建表](#partition-index-creating-table)
+ [将分区索引添加到现有表](#partition-index-existing-table)
+ [描述表上的分区索引](#partition-index-describing)
+ [使用分区索引的限制](#partition-index-limitations)
+ [使用索引进行优化的 GetPartitions 调用](#partition-index-getpartitions)
+ [与引擎集成](#partition-index-integration-engines)

## 关于分区索引
<a name="partition-index-1"></a>

当您创建分区索引时，请指定给定表中已存在的分区键列表。分区索引是表中定义的分区键的子列表。可以在表中定义的分区键的任何排列上创建分区索引。对于上面的 *sales\$1data* 表，可能的索引有 (country, category, year, creationDate)、(country, category, year)、(country, category)、(country)、(category, country, year, month) 等。

数据目录将按照创建索引时提供的顺序连接分区值。随着分区被添加到表中，索引的构建是一致的。可以为字符串（string、char 和 varchar）、数值（int、bigint、long、tinyint 和 smallint）和日期 (yyyy-MM-dd) 列类型创建索引。

**支持的数据类型**
+ 日期 – ISO 格式的日期，例如 `YYYY-MM-DD`。例如，date `2020-08-15`。该格式使用连字符（-）来分隔年月日。允许的日期索引范围为 `0000-01-01` 到 `9999-12-31`。
+ 字符串 – 用单引号或双引号括起的字符串文本。
+ Char – 固定长度字符数据，指定长度介于 1 到 255 之间，例如 char(10)。
+ Varchar – 可变长度字符数据，具有介于 1 和 65535 之间的指定长度，例如 varchar(10)。
+ 数值 – int、bigint、long、tinyint 和 smallint

数值、字符串和日期数据类型的索引支持 =、>、>=、<、<= 以及 between（介于）运算符。索引解决方案目前仅支持 `AND` 逻辑运算符。在使用索引进行筛选的表达式中，将忽略带有运算符“LIKE”、“IN”、“OR”和“NOT”的子表达式。对被忽略的子表达式的筛选是在应用索引筛选后获取的分区上完成的。

对于添加到表中的每个分区，都会创建一个相应的索引项。对于具有“n”个分区的表，1 个分区索引将生成“n”个分区索引项。同一个表上的“m”个分区索引将生成“m\$1n”个分区索引项。每个分区索引项将根据数据目录存储的当前 AWS Glue 定价策略收费。有关存储对象定价的详细信息，请参阅 [AWS Glue 定价](https://aws.amazon.com/glue/pricing/)。

## 使用分区索引创建表
<a name="partition-index-creating-table"></a>

您可以在表创建过程中创建分区索引。`CreateTable` 请求将 [`PartitionIndex` 对象](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-PartitionIndex)列表作为输入。在给定的表上最多可以创建 3 个分区索引。每个分区索引都需要一个名称和一个为表定义的 `partitionKeys` 列表。可以使用 [`GetPartitionIndexes` API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-GetPartitionIndexes) 获取在表上创建的索引

## 将分区索引添加到现有表
<a name="partition-index-existing-table"></a>

要将分区索引添加到现有表，请使用 `CreatePartitionIndex` 操作。您只能为每个 `CreatePartitionIndex` 操作创建一个 `PartitionIndex`。添加索引不会影响表的可用性，因为在创建索引期间该表继续可用。

添加的分区的索引状态设置为“CREATING (正在创建)”，并开始创建索引数据。如果创建索引的过程成功，则 indexStatus 将更新为“ACTIVE (活跃)”，对于不成功的过程，索引状态将更新为“FAILED (失败)”。索引创建可能会因多种原因而失败，您可以使用 `GetPartitionIndexes` 操作检索失败详细信息。可能出现的故障包括：
+ ENCRYPTED\$1PARTITION\$1ERROR – 不支持在具有加密分区的表上创建索引。
+ NVALID\$1PARTITION\$1TYPE\$1DATA\$1ERROR – 当 `partitionKey` 值不是相应 `partitionKey` 数据类型的有效值时观察到。例如：具有“int”数据类型的 `partitionKey` 的值为“foo”。
+ MISSING\$1PARTITION\$1VALUE\$1ERROR – 当 `indexedKey` 的 `partitionValue` 不存在时观察到。当表的分区不一致时可能会发生这种情况。
+ UNSUPPORTED\$1PARTITION\$1CHARACTER\$1ERROR – 当索引分区键的值包含字符 \$1u0000、\$1u0001 或 \$1u0002 时观察到的
+ INTERNAL\$1ERROR – 在创建索引时发生内部错误。

## 描述表上的分区索引
<a name="partition-index-describing"></a>

要获取在表上创建的分区索引，请使用 `GetPartitionIndexes` 操作。响应返回表上的所有索引，以及每个索引的当前状态（`IndexStatus`）。

分区索引的 `IndexStatus` 将是以下之一：
+ `CREATING` – 索引当前正在创建中，尚不能使用。
+ `ACTIVE` – 索引已准备就绪，可供使用。请求可以使用索引执行优化查询。
+ `DELETING` – 索引当前正在被删除，无法再使用。可以使用 `DeletePartitionIndex` 请求删除处于活动状态的索引，这会将状态从“ACTIVE (活跃)”移至“DELETING (正在删除)”。
+ `FAILED` – 在现有表上创建索引失败。每个表存储最后 10 个失败的索引。

在现有表上创建的索引的可能状态转换包括：
+ CREATING (正在创建) → ACTIVE (活跃) → DELETING (正在删除)
+ CREATING (正在创建) → FAILED (失败)

## 使用分区索引的限制
<a name="partition-index-limitations"></a>

创建分区索引后，请注意对表和分区功能的以下更改：

**创建新分区（添加索引后）**  
在表上创建分区索引后，添加到表中的所有新分区都将针对索引键的数据类型检查进行验证。索引键的分区值将针对数据类型格式进行验证。如果数据类型检查失败，则创建分区操作将失败。对于 *sales\$1data* 表，如果为类别为类型 `string` 且年份为类型 `int` 的键 (category, year) 创建索引，则创建 YEAR 值为“foo”的新分区将失败。

启用索引后，添加具有字符 U\$10000、U\$100001 和 U\$10002 的索引键值的分区将开始失败。

**表更新**  
在表上创建分区索引后，您将无法修改现有分区键的分区键名称，也无法更改向该索引注册的键的类型或顺序。

## 使用索引进行优化的 GetPartitions 调用
<a name="partition-index-getpartitions"></a>

当您在具有索引的表上调用 `GetPartitions` 时，您可以包含一个表达式，如果可能，数据目录将使用索引。索引的第一个键应传递到要用于筛选的索引的表达式中。筛选中的索引优化基于最佳效果应用。数据目录尝试尽可能多地使用索引优化，但在缺少索引或不支持的运算符的情况下，它会回退到加载所有分区的现有实现。

对于上面的 *sales\$1data* 表，让我们添加索引 [Country, Category, Year]。如果表达式中未传递“Country”，则注册的索引将无法使用索引筛选分区。您最多可以添加 3 个索引来支持各种查询模式。

让我们举一些示例表达式，看看索引是如何处理它们的：


| Expressions | 如何使用索引 | 
| --- | --- | 
|  Country = 'US'  |  索引将用于筛选分区。  | 
|  Country = 'US' and Category = 'Shoes'  |  索引将用于筛选分区。  | 
|  Category = 'Shoes'  |  不会使用索引，因为表达式中未提供“country”。将加载所有分区以返回响应。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018'  |  索引将用于筛选分区。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2  |  索引将用于获取 country = "US" 和 category = "shoes" 且 year > 2018 的所有分区。然后，将执行月份表达式的筛选。  | 
|  Country = 'US' AND Category = 'Shoes' OR Year > '2018'  |  由于表达式中存在 `OR` 运算符，因此不会使用索引。  | 
|  Country = 'US' AND Category = 'Shoes' AND (Year = 2017 OR Year = '2018')  |  索引将用于获取所有 country = "US" 和 category = "shoes" 的分区，然后对年份表达式进行筛选。  | 
|  Country in ('US', 'UK') AND Category = 'Shoes'  |  索引不会用于筛选，因为当前不支持 `IN` 运算符。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books')  |  索引将用于获取所有 country = "US" 的分区，然后对 Category 表达式进行筛选。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books') AND (creationDate > '2023-9-01'  |  索引将用于获取所有 country = "US" 且 creationDate > '2023-9-01' 的分区，然后对 Category 表达式进行筛选。  | 

## 与引擎集成
<a name="partition-index-integration-engines"></a>

Redshift Spectrum、Amazon EMR 和 AWS Glue ETL Spark DataFrames 能够在 AWS Glue 中的索引处于 ACTIVE 状态后利用索引来获取分区。[Athena](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index) 和 [AWS Glue ETL Dynamic frames](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates) 要求您执行额外的步骤以利用索引来改进查询。

### 启用分区筛选
<a name="enable-partition-filtering-athena"></a>

要在 Athena 中启用分区筛选，您需要按如下方式更新表属性：

1. 在 AWS Glue 控制台中，选择 **Data Catalog** 下的**表**。

1. 选择一个表。

1. 在**操作**下，选择**编辑表**。

1. 在**表属性**下，添加以下内容：
   + 键 – `partition_filtering.enabled`
   + 值 – `true`

1. 选择**应用**。

您还可以通过在 Athena 中运行 [ALTER TABLE SET PROPERTIES](https://docs.aws.amazon.com/athena/latest/ug/alter-table-set-tblproperties.html) 查询来设置此参数。

```
ALTER TABLE partition_index.table_with_index
SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')
```

## 使用爬网程序更新手动创建的数据目录表
<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)。