

# 如何使用自定义前缀和动态分区
<a name="partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning"></a>

可以使用[自定义前缀](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html)和[动态分区](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html)配置 Firehose。使用这些功能，您可以配置 Amazon S3 键并设置更好地支持您的使用案例的分区方案。您还可以将分区投影与这些分区方案一起使用，然后进行相应的配置。

例如，您可以使用自定义前缀功能获取具有 ISO 格式日期而非默认 `yyyy/MM/dd/HH` 方案的 Amazon S3 键。

您还可以将自定义前缀与动态分区结合使用，以便从 Firehose 消息中提取 `customer_id` 之类的属性，如下例所示。

```
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
```

使用该 Amazon S3 前缀，Firehose 传输流会将对象写入 `s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension` 等键。对于像 `customer_id` 这样的属性，其值可能事先未知，您可以使用分区投影类型 `injected` 并使用如下所示的 `CREATE TABLE` 语句：

```
CREATE EXTERNAL TABLE my_ingested_data3 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 customer_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy-MM-dd",
 "projection.day.range" = "2021-01-01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.customer_id.type" = "injected",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/"
)
```

当您查询具有类型 `injected` 的分区键的表时，您的查询必须包含该分区键的值。对 `my_ingested_data3` 表的查询可能如下所示：

```
SELECT *
FROM my_ingested_data3
WHERE day BETWEEN '2021-11-01' AND '2021-11-30'
AND customer_id = 'customer-1234'
```

## 将 DATE 类型用于日期分区键
<a name="partition-projection-kinesis-firehose-example-iso-formatted-dates"></a>

由于 `day` 分区键的值是 ISO 格式的，您也可以使用 `DATE` 类型而不是 `STRING` 类型作为日期分区键，如以下示例所示：

```
PARTITIONED BY (day DATE, customer_id STRING)
```

查询时，此策略允许您在分区键上使用日期函数而无需解析或转换，如以下示例所示：

```
SELECT *
FROM my_ingested_data3
WHERE day > CURRENT_DATE - INTERVAL '7' DAY
AND customer_id = 'customer-1234'
```

**注意**  
指定 `DATE` 类型的分区键时，假设您已使用[自定义前缀](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html)功能创建了日期为 ISO 格式的 Amazon S3 键。如果您使用默认的 Firehose 格式 `yyyy/MM/dd/HH`，则即使相应表属性的类型为 `date`，也必须将分区键指定为类型 `string`，如下例所示：  

```
PARTITIONED BY ( 
  `mydate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
   ...
  'projection.mydate.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')
```