

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

# 如何選擇分割區索引鍵
<a name="partition-projection-kinesis-firehose-example-choosing-partition-keys"></a>

您可以指定分割區投影將分割區位置映射至分割區索引鍵的方式。在前一部份的 `CREATE TABLE` 範例中，日期和小時被合併成一個名為 datehour 的分割區索引鍵，但也可以使用其他結構描述。例如，您也可以針對年份、月份、日期及小時，設定個別分割區索引鍵的資料表。

但是，將日期分割為年、月和日，表示無法使用 `date` 分割區投影類型。另一種方法是將日期與小時分開，即可仍然利用 `date` 分割區投影類型，但讓指定小時範圍的查詢更易於閱讀。

請記住，以下 `CREATE TABLE` 範例將日期與小時分開。由於 `date` 是 SQL 中的保留字詞，因此此範例會用 `day` 表示日期之分割區索引鍵的名稱。

```
CREATE EXTERNAL TABLE my_ingested_data2 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 hour INT
)
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.hour.type" = "integer",
 "projection.hour.range" = "0,23",
 "projection.hour.digits" = "2",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${hour}/"
)
```

在範例 `CREATE TABLE` 陳述式中，小時是個別的分割區索引鍵並設定為整數。小時分割區索引鍵的組態會指定範圍 0 到 23，而當 Athena 產生分割區位置時，小時應該格式化為兩位數。

對 `my_ingested_data2` 資料表的查詢可能如下所示：

```
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
```

## 了解分割區索引鍵和分割區投影資料類型
<a name="partition-projection-kinesis-firehose-example-partition-key-types-and-partition-projection-types"></a>

請注意，第一個 `CREATE TABLE` 範例中的 `datehour` 索引鍵在分割區投影組態中設定為 `date`，但是分割區索引鍵的類型為 `string`。第二個範例中的 `day` 也是如此。分割區投影組態中的類型只會告訴 Athena 在產生分割區位置時如何將值格式化。您指定的類型不會變更分割區索引鍵的類型；在查詢中，`datehour` 和 `day` 為 `string` 類型。

當查詢包含類似 `day = '2021/11/09'` 的條件時，Athena 會使用分割區投影組態中指定的日期格式剖析表達式右側的字串。在 Athena 確認日期是否位於所設定範圍後，它會再次使用日期格式將日期作為字串插入儲存位置範本。

同樣，對於像 `day > '2021/11/09'` 的查詢條件，Athena 會剖析右側並產生設定範圍內所有相符日期的清單。然後，它會使用日期格式將每個日期插入儲存位置範本，以建立分割區位置的清單。

寫入與 `day > '2021-11-09'` 或 `day > DATE '2021-11-09'` 相同的條件不起作用。在第一種情況下，日期格式不相符 (請注意連字號而不是正斜線)，而在第二種情況下，資料類型不相符。