

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

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

歸納是一種將資料集的記錄整理至稱為儲存貯體的類別的方法。

儲存貯體和歸納的含義與 Amazon S3 儲存貯體不同，且不應與 Amazon S3 儲存貯體混淆。在資料歸納中，具有相同屬性值的記錄會進入同一個儲存貯體。記錄會盡可能在儲存貯體之間平均分配，因此每個儲存貯體的資料量大致相同。

實際上，儲存貯體是檔案，而雜湊函數可確定記錄進入的儲存貯體。歸納的資料集在每個分割區的每個儲存貯體中會有一或多個檔案。檔案所屬的儲存貯體會以檔案名稱編碼。

## 歸納益處
<a name="ctas-partitioning-and-bucketing-bucketing-benefits"></a>

當資料集依特定屬性進行歸納，而且您想要擷取該屬性具有特定值的記錄時，歸納功能非常有用。由於資料是歸納性質的，Athena 可以使用此值來判斷要查看的檔案。例如，假設資料集依 `customer_id` 進行歸納，而您想要尋找特定客戶的所有記錄。Athena 會判斷包含這些記錄的儲存貯體，而且只會讀取該儲存貯體中的檔案。

當您的資料欄具有高基數 (也就是，有許多不同的值)、平均分散，以及您經常查詢特定值的資料欄時，就會發生歸納的適當候選項。

**注意**  
Athena 不支援使用 `INSERT INTO` 將新記錄新增至歸納的資料表。

## 支援依據已歸納資料欄進行篩選的資料類型
<a name="ctas-partitioning-and-bucketing-data-types-supported-for-filtering-on-bucketed-columns"></a>

您可以在具有某些資料類型的歸納資料欄上新增篩選條件。Athena 支援對具有下列資料類型的已歸納資料欄進行篩選：
+ BOOLEAN
+ BYTE
+ DATE
+ DOUBLE
+ FLOAT
+ INT
+ LONG
+ SHORT
+ STRING
+ VARCHAR

## Hive 和 Spark 支援
<a name="ctas-partitioning-and-bucketing-hive-and-spark-support"></a>

Athena 引擎版本 2 支援使用 Hive 儲存貯體演算法歸納的資料集，而 Athena 引擎版本 3 也支援 Apache Spark 歸納演算法。預設為 Hive 歸納。如果您的資料集是使用 Spark 演算法歸納，請使用 `TBLPROPERTIES` 子句將 `bucketing_format` 屬性值設定為 `spark`。

**注意**  
Athena 在每個 `CREATE TABLE AS SELECT` ([CTAS](ctas.md)) 查詢的分割區限制為 100 個。同樣地，您僅可以使用 [INSERT INTO](insert-into.md) 陳述式將最多 100 個分割區新增至目的地資料表。  
如果您超出此限制，您可能會收到錯誤訊息 HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS：超過分割區／儲存貯體 100 個開啟寫入器的限制)。若要避開此限制，您可以使用 CTAS 陳述式和一系列的 `INSERT INTO` 陳述式，每個陳述式可建立或插入最多 100 個分割區。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

## 歸納 CREATE TABLE 範例
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-example"></a>

若要為現有歸納的資料集建立資料表，請使用 `CLUSTERED BY (column)` 子句，後面接著 `INTO N BUCKETS` 子句。`INTO N BUCKETS` 子句指定了資料要歸納到的儲存貯體數量。

在下列 `CREATE TABLE` 範例中，使用 Spark 演算法，依 `customer_id` 將 `sales` 資料集歸納成 8 個儲存貯體。`CREATE TABLE` 陳述式會使用 `CLUSTERED BY` 和 `TBLPROPERTIES` 子句來設定相應的屬性。

```
CREATE EXTERNAL TABLE sales (...) 
... 
CLUSTERED BY (`customer_id`) INTO 8 BUCKETS 
... 
TBLPROPERTIES ( 
  'bucketing_format' = 'spark' 
)
```

## 歸納 CREATE TABLE AS (CTAS) 範例
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-as-example"></a>

若要使用 `CREATE TABLE AS` 指定歸納，請使用 `bucketed_by` 和 `bucket_count` 參數，如下列範例所示。

```
CREATE TABLE sales 
WITH ( 
  ... 
  bucketed_by = ARRAY['customer_id'], 
  bucket_count = 8 
) 
AS SELECT ...
```

## 歸納查詢範例
<a name="ctas-partitioning-and-bucketing-bucketing-query-example"></a>

下列範例查詢會尋找特定客戶在一週內購買的產品名稱。

```
SELECT DISTINCT product_name 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND customer_id = 'c123'
```

如果此資料表依 `sales_date` 進行分割並依 `customer_id` 歸納，則 Athena 可以計算客戶記錄所在的儲存貯體。Athena 每個分割區最多只能讀取一個檔案。