

# 受支持的分区投影类型
<a name="partition-projection-supported-types"></a>

表可以具有 `enum`、`integer`、`date,` 或 `injected` 分区列类型的任意组合。

## 枚举类型
<a name="partition-projection-enum-type"></a>

将 `enum` 类型用于其值为枚举集成员（例如，机场代码或 AWS 区域）的分区列。

在表中定义分区属性，如下所示：


****  

| 属性名称 | 示例值 | 说明 | 
| --- | --- | --- | 
| projection.columnName.type |  `enum`  | 必需。要用于 columnName 列的投影类型。该值必须是 enum（不区分大小写）才能发出使用枚举类型的信号。允许前导和尾随空格。 | 
| projection.columnName.values |  `A,B,C,D,E,F,G,Unknown`  | 必需。columnName 列的枚举分区值的逗号分隔列表。任何空格均被视为枚举值的一部分。 | 

**注意**  
作为最佳实践，我们建议将基于 `enum` 的分区投影使用数量限制在数十个或更少的范围。虽然 `enum` 投影没有特定限制，但表元数据的总大小在 gzip 压缩时不能超过约 1 MB 的 AWS Glue 限制。请注意，此限制将在表格的关键部分（如列名称、位置、存储格式和其他部分）之间共享。如果您发现自己在 `enum` 投影使用的唯一 ID 多于数十个，请考虑一种替代方法，例如在代理字段中分桶为较少数量的唯一值。通过折衷基数，您可以控制 `enum` 字段中返回的唯一值数量。

## 整数类型
<a name="partition-projection-integer-type"></a>

将整数类型用于其可能的值可被解释为定义的范围内的整数的分区列。投影整数列目前仅限于 Java 有符号长整型值的范围（-263 到 263-1，含这两个值）。


****  

| 属性名称 | 示例值 | 说明 | 
| --- | --- | --- | 
| projection.columnName.type |  `integer`  | 必需。要用于 columnName 列的投影类型。该值必须是 integer（不区分大小写）才能发出使用整数类型的信号。允许前导和尾随空格。 | 
| projection.columnName.range |  `0,10` `-1,8675309` `0001,9999`  | 必需。一个包含两个元素的逗号分隔列表，该列表提供将由对 columName 列进行的查询返回的最小范围值和最大范围值。请注意，必须使用逗号来分隔值，而不是使用连字符。这些值包含在内，它们可以是负数，并且可以有前导零。允许前导和尾随空格。 | 
| projection.columnName.interval |  `1` `5`  | 可选。一个正整数，它指定 columName 列的连续分区值之间的间隔。例如，具有 interval 值“1”的 range 值“1,3”将产生值 1、2 和 3。具有 interval 值“2”的相同 range 值将产生值 1 和 3，并跳过 2。允许前导和尾随空格。默认 为 1。 | 
| projection.columnName.digits |  `1` `5`  | 可选。一个正整数，它指定要包含在 columName 列的分区值的最终表示形式中的位数。例如，具有 digits 值“1”的 range 值“1,3”将产生值 1、2 和 3。具有 digits 值“2”的相同 range 值将产生值 01、02 和 03。允许前导和尾随空格。默认值不包含静态位数和前导零。 | 

## 日期类型
<a name="partition-projection-date-type"></a>

将日期类型用于其值可被解释为定义的范围内的日期（带可选时间）的分区列。

**重要**  
投影日期列在查询执行时以协调世界时 (UTC) 格式生成。


****  

| 属性名称 | 示例值 | 说明 | 
| --- | --- | --- | 
| projection.columnName.type |  `date`  | 必需。要用于 columnName 列的投影类型。该值必须是 date（不区分大小写）才能发出使用日期类型的信号。允许前导和尾随空格。 | 
| projection.columnName.range |  `201701,201812` `01-01-2010,12-31-2018` `NOW-3YEARS,NOW` `201801,NOW+1MONTH`  |  必需。一个包含两个元素的逗号分隔列表，该列表提供 *columName* 列的最小范围和最大范围 `range` 值。这些值包含在内，它们可以使用任何与 Java `java.time.*` 日期类型兼容的格式。最小值和最大值必须使用相同的格式。`.format` 属性中指定的格式必须是用于这些值的格式。 此列还可以包含格式为以下正则表达式模式的相对日期字符串： `\s*NOW\s*(([\+\-])\s*([0-9]+)\s*(YEARS?\|MONTHS?\|WEEKS?\|DAYS?\|HOURS?\|MINUTES?\|SECONDS?)\s*)?` 允许使用空格，但在日期中，文本将被视为日期字符串的一部分。  | 
| projection.columnName.format |  `yyyyMM` `dd-MM-yyyy` `dd-MM-yyyy-HH-mm-ss`  | 必需。基于 Java 日期格式 [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) 的日期格式字符串。可以是任何受支持的 Java.time.\$1 类型。 | 
| projection.columnName.interval |  `1` `5`  |  一个正整数，它指定 *columName* 列的连续分区值之间的间隔。例如，具有 `interval` 值 `1` 和 `interval.unit` 值 `MONTHS` 的 `range` 值 `2017-01,2018-12` 将产生值 2017-01、2017-02、2017-03，依此类推。具有 `interval` 值 `2` 和 `interval.unit` 值 `MONTHS` 的相同 `range` 值将产生值 2017-01、2017-03、2017-05，依此类推。允许前导和尾随空格。 如果提供的日期的精度为单日或单月，则 `interval` 是可选的，默认值分别为 1 天或 1 个月。否则，`interval` 是必需的。  | 
| projection.columnName.interval.unit |  `YEARS` `MONTHS` `WEEKS` `DAYS` `HOURS` `MINUTES` `SECONDS` `MILLIS`  |  一个时间单位词，它表示 [ChronoUnit](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.html) 的序列化形式。可能的值为 `YEARS`、`MONTHS`、`WEEKS`、`DAYS`、`HOURS`、`MINUTES`、`SECONDS` 或 `MILLIS`。这些值不区分大小写。 如果提供的日期的精度为单日或单月，则 `interval.unit` 是可选的，默认值分别为 1 天或 1 个月。否则，`interval.unit` 是必需的。  | 

**Example – 按月分区**  
以下示例表配置按月对 2015 年至今的数据进行分区。  

```
'projection.month.type'='date', 
'projection.month.format'='yyyy-MM', 
'projection.month.interval'='1', 
'projection.month.interval.unit'='MONTHS', 
'projection.month.range'='2015-01,NOW', 
...
```

## 注入的类型
<a name="partition-projection-injected-type"></a>

将注入的类型用于分区列，这些分区列的可能值无法在某个逻辑范围内通过程序生成，而是在查询的 `WHERE` 子句中作为单个值提供。

请务必记住以下几点：
+ 如果未为每个注入列提供筛选条件表达式，则对注入列进行的查询将失败。
+ 对于在注入列上具有多个筛选条件表达式值的查询，只有在这些值分离时，这些查询才会成功。
+ 仅支持 `string` 类型的列。
+ 将 `WHERE IN` 子句与注入的分区列一起使用时，`IN` 列表中最多可以指定 1000 个值。如果要查询的数据集中某个注入的列包含超过 1000 个分区，请将查询拆分为多个较小的查询，使每个查询的 `WHERE IN` 子句中最多包含 1000 个值，然后再聚合结果。


****  

| 属性名称 | 值 | 说明 | 
| --- | --- | --- | 
| projection.columnName.type |  `injected`  | 必需。要用于 columnName 列的投影类型。仅支持 string 类型。指定的值必须是 injected（不区分大小写）。允许前导和尾随空格。 | 

有关更多信息，请参阅 [何时使用 `injected` 投影类型](partition-projection-dynamic-id-partitioning.md#partition-projection-injection)。