

# 设置分区投影
<a name="partition-projection-setting-up"></a>

在表的属性中设置分区投影是一个包含两个步骤的过程：

1. 指定每个分区列的数据范围和相关模式，或使用自定义模板。

1. 为表启用分区投影。

**注意**  
在向现有表添加分区投影属性之前，要为其设置分区投影属性的分区列必须已存在于表架构中。如果分区列尚不存在，则必须将分区列手动添加到现有表中。AWS Glue 不会自动为您执行此步骤。

本节介绍如何为 AWS Glue 设置表属性。要设置这些表属性，您可以使用 AWS Glue 控制台、Athena [CREATE TABLE](create-table.md) 查询或 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html) 操作。以下过程说明如何在 AWS Glue 控制台中设置属性。

**要使用 AWS Glue 控制台配置并启用分区投影**

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

1. 选择 **Tables (表)** 选项卡。

   在 **Tables (表)** 选项卡上，您可以编辑现有表，也可以选择 **Add tables (添加表)** 来创建新表。有关手动添加表或使用爬网程序添加表的信息，请参阅《AWS Glue 开发人员指南**》中的[在 AWS Glue 控制台上使用表](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)。

1. 在表的列表中，选择要编辑的表的链接。  
![\[在 AWS Glue 控制台中，选择要编辑的表。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/partition-projection-1.png)

1. 依次选择 **Actions**（操作）、**Edit table**（编辑表）。

1. 在 **Edit table**（编辑表）页面的 **Table properties**（表属性）部分中，对于每个分区列，添加以下键值对：

   1. 对于 **Key (键)**，添加 `projection.columnName.type`。

   1. 对于 **Value (值)**，添加受支持的类型之一：`enum`、`integer`、`date` 或 `injected`。有关更多信息，请参阅 [受支持的分区投影类型](partition-projection-supported-types.md)。

1. 按照[受支持的分区投影类型](partition-projection-supported-types.md)中的指导信息进行操作，根据配置要求添加其他键/值对。

   以下示例表配置将为分区投影配置 `year` 列，从而将可返回的值限定为 2010 年至 2016 年的数据。  
![\[在 AWS Glue 控制台表属性中配置分区列的分区投影。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/partition-projection-3.png)

1. 添加键/值对以启用分区投影。对于 **Key (键)**，输入 `projection.enabled`，对于其 **Value (值)**，输入 `true`。
**注意**  
您可以随时通过将 `projection.enabled` 设置为 `false` 来对此表禁用分区投影。

1. 完成后，选择 **Save**。

1. 在 Athena 查询编辑器中，测试查询为表配置的列。

   以下示例查询使用 `SELECT DISTINCT` 从 `year` 列返回唯一值。数据库包含 1987 年至 2016 年的数据，但 `projection.year.range` 属性将返回的值限定为 2010 年至 2016 年的数据。  
![\[查询使用分区投影的列。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/partition-projection-5.png)
**注意**  
如果将 `projection.enabled` 设置为 `true`，但未能配置一个或多个分区列，则会收到与以下内容类似的错误消息：  
`HIVE_METASTORE_ERROR: Table database_name.table_name is configured for partition projection, but the following partition columns are missing projection configuration: [column_name] (table database_name.table_name)`.

## 如何指定自定义 S3 存储位置
<a name="partition-projection-specifying-custom-s3-storage-locations"></a>

在 AWS Glue 中编辑表属性时，还可以为投影分区指定自定义 Amazon S3 路径模板。利用自定义模板，Athena 可以将分区值正确映射到未遵循典型 `.../column=value/...` 模式的自定义 Amazon S3 文件位置。

可以选择使用自定义模板。但是，如果您使用自定义模板，则该模板中必须为每个分区列包含一个占位符。模板化位置必须以正斜杠结尾，以便分区的数据文件位于每个分区的“文件夹”中。

**指定自定义分区位置模板**

1. 按照步骤[使用 AWS Glue 控制台配置并启用分区投影](#partition-projection-setting-up-procedure)，添加一个指定自定义模板的附加键/值对，如下所示：

   1. 对于**键**，输入 `storage.location.template`。

   1. 对于 **Value (值)**，指定一个位置，该位置为每个分区列包含一个占位符。确保每个占位符(和 S3 路径本身)都以单个正斜杠结束。

      以下示例模板值假定一个具有分区列 `a`、`b` 和 `c` 的表。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/      
      ```

      ```
      s3://amzn-s3-demo-bucket/table_root/c=${c}/${b}/some_static_subdirectory/${a}/${b}/${c}/${c}/      
      ```

      对于同一个表，以下示例模板值无效，因为它不包含列 `c` 的占位符。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/         
      ```

1. 选择**应用**。