

# 将分区投影与 Amazon Athena 结合使用
<a name="partition-projection"></a>

可以在 Athena 中使用分区投影来加快对高度分区表的查询处理，并自动执行分区管理。

在分区投影中，Athena 使用直接在 Amazon Glue 表上配置的表属性计算分区值和位置。表属性允许 Athena“投影”或确定必要的分区信息，无需在 Amazon Glue Data Catalog 中进行更耗时的元数据查找。由于内存中的操作通常快于远程操作，因此，分区投影可以减少针对高度分区表的查询的运行时间。根据查询和基础数据的具体特征，分区投影可以显著减少在分区元数据检索方面受到限制的查询的运行时间。

## 了解分区修剪与分区投影
<a name="partition-projection-pruning-vs-projection"></a>

分区修剪将收集元数据并对其进行“修剪”，以便只存在适用于查询的分区。这通常会加快查询速度。Athena 对所有带分区列的表（包括为分区投影配置的表）使用分区修剪。

通常，在处理查询时，Athena 会在执行分区修剪之前向 Amazon Glue Data Catalog 发出 `GetPartitions` 调用。如果表具有大量分区，则使用 `GetPartitions` 会导致性能降低。要避免发生此情况，您可以使用分区投影。分区投影可让 Athena 避免调用 `GetPartitions`，因为分区投影配置为 Athena 提供了自行构建分区所需的所有信息。

## 如何使用分区投影
<a name="partition-projection-using"></a>

要使用分区投影，请在 Amazon Glue Data Catalog 或[外部 Hive 元存储](connect-to-data-source-hive.md)中的表属性中为每个分区列指定分区值和投影类型的范围。表的这些自定义属性可让 Athena 了解在对表运行查询时应使用哪种分区模式。在查询执行期间，Athena 使用此信息对分区值进行投影，而不是从 Amazon Glue Data Catalog 或外部 Hive 元存储中检索这些值。这不仅将减少查询执行时间，还将自动执行分区管理，因为不再需要在 Athena、Amazon Glue 或外部 Hive 元存储中手动创建分区。

**重要**  
在表上启用分区投影会导致 Athena 忽略在 Amazon Glue Data Catalog 或 Hive 元存储中注册到表的任何分区元数据。

## 一些使用案例
<a name="partition-projection-use-cases"></a>

分区投影在许多场景中都很有用，其中包括：
+ 对高度分区表的查询不会像您希望的那样快速完成。
+ 在数据中创建新的日期或时间分区时，可以定期向表添加分区。利用分区投影，可以配置可在新数据到达时使用的相对日期范围。
+ 您在 Amazon S3 中有高度分区的数据。在 Amazon Glue Data Catalog 或 Hive 元存储中为数据建模是不切实际的，并且您的查询仅读取其中的一小部分。

### 可投影的分区结构
<a name="partition-projection-known-data-structures"></a>

当您的分区遵循可预测的模式时（包括但不限于以下情况），分区投影最易配置：
+ **整数** – 任何连续的整数序列，例如 `[1, 2, 3, 4, ..., 1000]` 或 `[0500, 0550, 0600, ..., 2500]`。
+ **日期** – 任何连续的日期或日期时间序列，例如 `[20200101, 20200102, ..., 20201231]` 或 `[1-1-2020 00:00:00, 1-1-2020 01:00:00, ..., 12-31-2020 23:00:00]`。
+ **枚举值** – 一组有限的枚举值，例如机场代码或 Amazon Web Services 区域。
+ **Amazon Web Services 服务 日志** – Amazon Web Services 服务 日志通常具有一个已知结构，您可以在 Amazon Glue 中指定该结构的分区方案，并且 Athena 可以将其用于分区投影。

### 如何自定义分区路径模板
<a name="partition-projection-custom-s3-storage-locations"></a>

预设情况下，Athena 使用 `s3://amzn-s3-demo-bucket/<table-root>/partition-col-1=<partition-col-1-val>/partition-col-2=<partition-col-2-val>/` 格式生成分区位置，但如果您数据的组织方式不同，则 Athena 会提供用于自定义此路径模板的机制。要查看步骤，请参阅[如何指定自定义 S3 存储位置](partition-projection-setting-up.md#partition-projection-specifying-custom-s3-storage-locations)。

## 注意事项和限制
<a name="partition-projection-considerations-and-limitations"></a>

请注意以下事项：
+ 有了分区投影，便无需在 Amazon Glue 或外部 Hive 元存储中手动指定分区。
+ 在表上启用分区投影时，Athena 将为该表忽略 Amazon Glue Data Catalog 或外部 Hive 元存储中的任何分区元数据。
+ 如果 Amazon S3 中没有投影分区，Athena 仍会对分区进行投影。Athena 不会引发错误，但也未返回任何数据。不过，如果您的空分区过多，则性能会低于传统的 Amazon Glue 分区。如果有一半以上的投影分区为空，建议您使用传统分区。
+ 超出为分区投影定义的范围边界的值的查询不会返回错误。相反，查询将会运行，但返回零行。例如，如果您的时间相关数据从 2020 年开始，并且定义为 `'projection.timestamp.range'='2020/01/01,NOW'`，一个类似 `SELECT * FROM table-name WHERE timestamp = '2019/02/02'` 的查询将成功执行，但将返回零行。
+ 分区投影仅在通过 Athena 查询表时可用。如果通过其他服务（例如 Amazon Redshift Spectrum、Athena for Spark 或 Amazon EMR）读取同一个表，则使用标准分区元数据。
+ 由于分区投影是一项仅限 DML 的功能，因此 `SHOW PARTITIONS` 不会列出由 Athena 投影但未注册到 Amazon Glue 目录或外部 Hive 元存储中的分区。
+ Athena 不使用视图的表属性作为分区投影的配置。要变通解决此限制，请在视图引用的表的表属性中配置和启用分区投影。

**Topics**
+ [了解分区修剪与分区投影](#partition-projection-pruning-vs-projection)
+ [如何使用分区投影](#partition-projection-using)
+ [一些使用案例](#partition-projection-use-cases)
+ [注意事项和限制](#partition-projection-considerations-and-limitations)
+ [设置分区投影](partition-projection-setting-up.md)
+ [受支持的分区投影类型](partition-projection-supported-types.md)
+ [使用动态 ID 分区](partition-projection-dynamic-id-partitioning.md)
+ [Amazon Data Firehose 示例](partition-projection-kinesis-firehose-example.md)