

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

# 什麼是分割？
<a name="ctas-partitioning-and-bucketing-what-is-partitioning"></a>

分割表示根據資料的特定屬性，將資料整理到 Amazon S3 上的目錄 (或「字首」)。這類屬性稱為分割區索引鍵。常見的分割區索引鍵是日期或一些其他時間單位，例如年份或月份。不過，資料集可以依多個索引鍵進行分割。例如，有關產品銷售的資料可能依日期、產品類別和市場進行分割。

## 決定如何分割
<a name="ctas-partitioning-and-bucketing-deciding-how-to-partition"></a>

分割區索引鍵的理想候選者是始終或經常在查詢中使用且具有低基數的屬性。分割區過多和分割區過少之間需要取得權衡。由於分割區過多，檔案數增加會產生負荷。篩選分割區本身也有一些負荷。如果分割區太少，查詢通常需要掃描更多資料。

## 建立分割的資料表
<a name="ctas-partitioning-and-bucketing-creating-a-partitioned-table"></a>

分割資料集後，您可以在 Athena 建立分割的資料表。分割的資料表是具有分割區索引鍵的資料表。使用 `CREATE TABLE` 時，您可以將分割區新增至資料表中。使用 `CREATE TABLE AS` 時，在 Amazon S3 上建立的分割區會自動新增至資料表。

在 `CREATE TABLE` 陳述式中，您可以在 `PARTITIONED BY (column_name data_type)` 子句中指定分割區索引鍵。在 `CREATE TABLE AS` 陳述式中，您可以在 `WITH (partitioned_by = ARRAY['partition_key'])` 子句或 Iceberg 資料表的 `WITH (partitioning = ARRAY['partition_key'])` 中指定分割區索引鍵。出於效能考量，分割區索引鍵應始終是類型 `STRING`。如需詳細資訊，請參閱[使用字串做為分割區索引鍵的資料類型](data-types-timestamps.md#data-types-timestamps-partition-key-types)。

如需其他 `CREATE TABLE` 和 `CREATE TABLE AS` 語法詳細資訊，請參閱 [CREATE TABLE](create-table.md) 和 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。

## 查詢分割的資料表
<a name="ctas-partitioning-and-bucketing-querying-partitioned-tables"></a>

當您查詢分割區資料表時，Athena 會使用查詢中的述詞來篩選分割區的清單。然後，其會使用相符分割區的位置來處理找到的檔案。Athena 只要不讀取與查詢述詞不相符的分割區中的資料，就能有效減少掃描的資料量。

### 範例
<a name="ctas-partitioning-and-bucketing-partitioned-table-example-queries"></a>

假設您有一個依 `sales_date` 和 `product_category` 分割的資料表，並且想知道特定類別中一周的總收入。您可以在 `sales_date` 和 `product_category` 資料欄上加入述詞，以確保 Athena 只掃描最少量的資料，如下列範例所示。

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND product_category = 'Toys'
```

假設您有依日期分割的資料集，但也有精細的時間戳記。

使用 Iceberg 資料表，您可以宣告分割區索引鍵與資料欄之間的關係，但是使用 Hive 資料表時，查詢引擎對資料欄和分割區索引鍵之間的關係一無所知。因此，您必須在查詢中包含資料欄和分割區索引鍵的述詞，以確保查詢掃描的資料不會超過必要數目。

例如，假設上一個範例中的 `sales` 資料表也有 `TIMESTAMP` 資料類型的 `sold_at` 資料欄。如果您只想在特定時間範圍內獲得收入，則可以像這樣寫入查詢：

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date = '2023-02-28' 
AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' 
AND product_category = 'Toys'
```

如需有關查詢 Hive 和 Iceberg 資料之間的差異的詳細資訊，請參閱 [如何寫入同樣按時間分割的時間戳記欄位的查詢](data-types-timestamps.md#data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned)。