

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何使用自訂字首和動態分割
<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 格式化日期的 Amazon S3 索引鍵，而不是預設 `yyyy/MM/dd/HH` 結構描述。

您還可以將自訂字首與動態分割結合，從 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}')
```