

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

# 使用動態 ID 分割
<a name="partition-projection-dynamic-id-partitioning"></a>

當您的資料以高基數屬性分割，或者無法事先知道這些值時，您可使用 `injected` 投影類型。此類屬性的範例包括使用者名稱，以及裝置或產品的 ID。當您使用 `injected` 投影類型來設定分割區索引鍵時，Athena 會使用查詢本身的值來計算將要讀取的分割區集。

對於具有使用 `injected` 投影類型設定的分割區索引鍵的資料表，若要讓 Athena 能夠在此類資料表上執行查詢，必須符合下列條件：
+ 您的查詢必須包含至少一個分割區索引鍵值。
+ 值必須是文字或運算式，可在不讀取任何資料的情況下進行評估。

如果不滿足上述任何條件，您的查詢會失敗，並出現下列錯誤：

CONSTRAINT\$1VIOLATION：對於注入的投影分割區資料欄 *column\$1name*，WHERE 子句必須僅包含靜態等式條件，且必須至少存在一個此類條件。

## 何時使用 `injected` 投影類型
<a name="partition-projection-injection"></a>

假設您有一個資料集，其中包含 IoT 裝置的事件，並根據裝置的 ID 進行分割。此資料集具有下列特性：
+ 裝置 ID 隨機產生。
+ 新裝置會經常進行佈建。
+ 目前有數十萬部裝置，未來將會有數百萬部裝置。

使用傳統的中繼儲存難以管理此資料集。在資料儲存與中繼儲存之間難以保持分割區同步，並且在查詢規劃期間篩選分割區可能較慢。但是，如果您將資料表設定為使用分割區投影，並使用 `injected` 投影類型，則有兩項優勢：您不必管理中繼儲存中的分割區，並且您的查詢也不必查詢分割區中繼資料。

下列 `CREATE TABLE` 範例會針對剛才描述的裝置事件資料集來建立資料表。該資料表使用注入的投影類型。

```
CREATE EXTERNAL TABLE device_events (
  event_time TIMESTAMP,
  data STRING,
  battery_level INT
)
PARTITIONED BY (
  device_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
  "projection.enabled" = "true",
  "projection.device_id.type" = "injected",
  "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${device_id}"
)
```

下列範例查詢會查詢 12 小時內，從三個特定裝置接收的事件數目。

```
SELECT device_id, COUNT(*) AS events
FROM device_events
WHERE device_id IN (
  '4a770164-0392-4a41-8565-40ed8cec737e',
  'f71d12cf-f01f-4877-875d-128c23cbde17',
  '763421d8-b005-47c3-ba32-cc747ab32f9a'
)
AND event_time BETWEEN TIMESTAMP '2023-11-01 20:00' AND TIMESTAMP '2023-11-02 08:00'
GROUP BY device_id
```

當您執行此查詢時，Athena 會看到 `device_id` 分割區索引鍵的三個值，並使用這些值來計算分割區位置。Athena 會使用 `storage.location.template` 屬性的值來產生下列位置：
+ `s3://amzn-s3-demo-bucket/prefix/4a770164-0392-4a41-8565-40ed8cec737e`
+ `s3://amzn-s3-demo-bucket/prefix/f71d12cf-f01f-4877-875d-128c23cbde17`
+ `s3://amzn-s3-demo-bucket/prefix/763421d8-b005-47c3-ba32-cc747ab32f9a`

如果您從分割區投影組態中省略 `storage.location.template` 屬性，Athena 會根據 `LOCATION` 中的值 (例如 `s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e`)，使用 HIVE 樣式的分割區來投影分割區位置。