

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

# 資料分割
<a name="zero-etl-data-partitioning"></a>

## 什麼是資料分區？
<a name="partitioning-overview"></a>

 資料分區是一種技術，可將大型資料集分成更小、更易於管理的區段，稱為分區。在 AWS Glue 零 ETL 整合的情況下，分割會根據特定資料欄值或這些值的轉換，在目標位置組織您的資料。

### 資料分區的優點
<a name="partitioning-benefits"></a>

 有效的資料分區可為分析工作負載提供幾項關鍵優勢：
+  **提高查詢效能：**查詢可以略過不相關的分區 (分區剔除)，減少需要掃描的資料量。
+  **降低成本：**透過掃描較少的資料，可以降低分析查詢的運算和 I/O 成本。
+  **更好的可擴展性：**分區允許平行處理資料區段，從而更有效地擴展分析工作負載。
+  **簡化的資料生命週期管理：**可以在分區層級管理保留政策，讓您更輕鬆地封存或刪除較舊的資料。

### 金鑰分區概念
<a name="partitioning-concepts"></a>

分區資料欄  
 資料中的資料欄，用於確定如何將記錄組織到分區中。有效的分區資料欄應與常見的查詢模式保持一致，並具有適當的基數。

分區函數  
 套用至分區資料欄值的轉換，以建立實際分區邊界。範例包括身分 (使用原始值) 和基於時間的函數 (年、月、日、小時)。

分區剔除  
 查詢引擎識別和略過不包含查詢相關資料之分區的程序，可大幅提高效能。

分割區間隔  
 資料分區的詳細程度。更精細的精細程度 (更多分區) 可以提高查詢效能，但可能會增加中繼資料負荷。更粗糙的精細程度 (較少的分區) 可減少中繼資料負荷，但可能會導致掃描更多資料。

### Glue 零 ETL AWS 整合中的分割
<a name="partitioning-in-zero-etl"></a>

 AWS Glue 零 ETL 整合使用 Apache Iceberg 資料表格式，可提供進階分割功能。建立零 ETL 整合時，您可以：
+ 使用針對資料來源最佳化的預設分區策略
+ 定義根據您的查詢模式而量身打造的自訂分區規格
+ 將轉換套用至分區資料欄 (特別適用於時間戳記型分區)
+ 結合多層分區的多個分區策略

 設定零 ETL 整合時，會透過 `CreateIntegrationTableProperty` API 來指定分區組態。設定完成後， AWS Glue 會自動套用這些分割策略，以在目標位置整理您的資料。

## 分區規格 API 參考
<a name="partition-api-reference"></a>

在 CreateIntegrationTableProperties API 中使用下列參數來設定分區：

PartitionSpec  
分區規格陣列，定義如何在目標位置分區資料。  

```
{
  "partitionSpec": [
    {
      "fieldName": "timestamp_col",
      "functionSpec": "month",
      "conversionSpec": "epoch_milli"
    },
    {
      "fieldName": "category",
      "functionSpec": "identity"
    }
  ]
}
```

FieldName  
UTF-8 字串 (1-128 個位元組），指定用於分區的資料欄名稱。

FunctionSpec  
指定分區函數。有效值：  
+ `identity` - 直接使用來源值而不進行轉換
+ `year` - 從時間戳記值中擷取年份 (例如 2023)
+ `month` - 從時間戳記值中擷取月份 (例如 2023 年 1 月)
+ `day` - 從時間戳記值中擷取日期 (例如 2023-01-15)
+ `hour` - 從時間戳記值中擷取小時 (例如 2023-01-15-14)
 時間型函數 (`year`、`month`、`day`、`hour`) 需要 `ConversionSpec` 參數來指定來源時間戳記格式。

ConversionSpec  
 指定來源資料的時間戳記格式的 UTF-8 字串。有效的值如下：  
+ `epoch_sec` - 以秒為單位的 Unix epoch 時間戳記
+ `epoch_milli` - 以毫秒為單位的 Unix epoch 時間戳記
+ `iso` - ISO 8601 格式的時間戳記

## 分區策略
<a name="partitioning-strategies"></a>

### 預設分區
<a name="default-partitioning"></a>

 未指定分割區資料欄時， AWS Glue Zero-ETL 會套用針對資料來源最佳化的預設分割區策略：
+  **基於主索引鍵的分區：**對於具有主索引鍵的來源 (例如 DynamoDB 資料表)， AWS Glue 零 ETL 會使用具有儲存貯體的主索引鍵來自動分區資料，以防止分區爆炸。

 預設分區的設計適合常見查詢模式，不需要手動設定。不過，對於特定查詢模式或效能需求，您可能想要定義自訂分區策略。

### 使用者定義的分區策略
<a name="user-defined-partitioning"></a>

 AWS Glue Zero-ETL 可讓您使用 `PartitionSpec` 參數定義自訂分割策略。可以指定一個或多個分區資料欄，並將不同的分區函數套用至每個資料欄。

 **身分分區**會使用資料欄的原始值來建立分區。此策略適用於具有中低基數的資料欄，例如類別、區域或狀態欄位。

**Example 身分分區範例**  

```
{
  "partitionSpec": [
    {
      "fieldName": "category",
      "functionSpec": "identity"
    }
  ]
}
```
 這會為「類別」欄中的每個唯一值建立單獨的分區。

**警告**  
 避免使用具有高基數資料欄 (例如主索引鍵或時間戳記) 的身分分區，因為這可能會導致分區爆炸，進而降低效能並增加中繼資料負荷。

 **基於時間的分區**會根據不同精細程度 (年、月、日或小時) 的時間戳記值來組織資料。此策略非常適合用於時間序列資料，並可實現高效的時間範圍查詢。

 使用以時間為基礎的分割時， AWS Glue Zero-ETL 可以在套用分割區函數之前，自動將各種時間戳記格式轉換為標準化格式。使用 `ConversionSpec` 參數來指定此轉換。

**Example 基於時間的分區範例**  

```
{
  "partitionSpec": [
    {
      "fieldName": "created_at",
      "functionSpec": "month",
      "conversionSpec": "epoch_milli"
    }
  ]
}
```
 其會根據 "created\_at" 資料欄按月分區資料，其中包含以毫秒為單位的 Unix epoch 時間戳記。

 AWS Glue Zero-ETL 支援下列以時間為基礎的分割區函數：
+  **year:**按年分區資料 (例如 2023 年、2024 年) 
+  **month:**按月分區資料 (例如 2023 年 1 月、2023 年 2 月) 
+  **day:**按天分區資料 (例如 2023-01-01、2023-01-02) 
+  **hour:**按小時分區資料 (例如 2023-01-01-01、2023-01-01-02) 

 AWS Glue Zero-ETL 透過 `ConversionSpec` 參數支援下列時間戳記格式：
+  **epoch\_sec:**以秒為單位的 Unix epoch 時間戳記 
+  **epoch\_milli:**以毫秒為單位的 Unix epoch 時間戳記 
+  **iso:**ISO 8601 格式的時間戳記 

**注意**  
 原始資料欄值在來源資料中保持不變。 AWS Glue 只會將分割區資料欄值轉換為目標資料庫資料表中的時間戳記類型。轉換僅適用於分區程序。

 **多層級分區**結合多個分區策略，以建立層級分區方案。這有助於針對相同的資料集最佳化不同類型的查詢。

**Example 多層分區範例**  

```
{
  "partitionSpec": [
    {
      "fieldName": "created_at",
      "functionSpec": "month",
      "conversionSpec": "iso"
    },
    {
      "fieldName": "region",
      "functionSpec": "identity"
    }
  ]
}
```
 這會建立雙層分區結構描述：先按月 (從 "created\_at" 欄)，再按區域。這可實現高效查詢，按日期範圍、特定區域或這些維度的組合進行篩選。

 設計多層分區方案時，請考慮：
+  先在分區層級中首先放置選擇性較高的資料欄 
+  平衡分區精細度與分區數目 
+  將分區方案與最常見的查詢模式保持一致 

## 最佳實務
<a name="best-practices"></a>

### 分區資料欄選取
<a name="best-practices-partition-column-selection"></a>
+  請勿將高基數資料欄與 `identity` 分區函數搭配使用。使用具有身分分區的高基數資料欄會建立許多小型分區，這可能會大幅降低擷取效能。高基數資料欄可能包括：
  + 主索引鍵
  + 時間戳記欄位 (例如 `LastModifiedTimestamp`、`CreatedDate`)
  + 系統產生的時間戳記
+  請勿選取同一資料欄上的多個時間戳記分區。例如：

  ```
  "partitionSpec": [
        {"fieldName": "col1", "functionSpec": "year", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "month", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "day", "conversionSpec" : "epoch_milli"},
        {"fieldName": "col1", "functionSpec": "hour", "conversionSpec" : "epoch_milli"}
  ]
  ```

### Partition FunctionSpec/ConversionSpec selection
<a name="best-practices-partition-functionspec-conversionspec-selection"></a>
+  指定正確的 ConversionSpec (epoch\_sec \| epoch\_milli \| iso)，代表在使用以時間戳記為基礎的分割區函數時，針對以時間戳記為基礎的分割區選擇的資料欄值格式。 AWS Glue Zero-ETL 會使用此參數，在分割之前將來源資料正確轉換為時間戳記格式。
+  根據資料量使用適當的精細度 (year/month/day/hour)。
+  使用 ISO 時間戳記時，請考慮時區的影響。 AWS Glue Zero-ETL 會以 UTC 時區填入所選時間戳記資料欄的所有記錄值。

## 錯誤處理
<a name="error-handling"></a>

### NEEDS\_ATTENTION State
<a name="needs-attention-state"></a>

 整合會在下列情況下進入 NEEDS\_ATTENTION 狀態：
+ 來源中不存在指定的分區資料欄
+ 分區資料欄的時間戳記轉換失敗