View a markdown version of this page

資料分割 - AWS Glue

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

資料分割

什麼是資料分區?

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

資料分區的優點

有效的資料分區可為分析工作負載提供幾項關鍵優勢:

  • 提高查詢效能:查詢可以略過不相關的分區 (分區剔除),減少需要掃描的資料量。

  • 降低成本:透過掃描較少的資料,可以降低分析查詢的運算和 I/O 成本。

  • 更好的可擴展性:分區允許平行處理資料區段,從而更有效地擴展分析工作負載。

  • 簡化的資料生命週期管理:可以在分區層級管理保留政策,讓您更輕鬆地封存或刪除較舊的資料。

金鑰分區概念

分區資料欄

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

分區函數

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

分區剔除

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

分割區間隔

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

Glue 零 ETL AWS 整合中的分割

AWS Glue 零 ETL 整合使用 Apache Iceberg 資料表格式,可提供進階分割功能。建立零 ETL 整合時,您可以:

  • 使用針對資料來源最佳化的預設分區策略

  • 定義根據您的查詢模式而量身打造的自訂分區規格

  • 將轉換套用至分區資料欄 (特別適用於時間戳記型分區)

  • 結合多層分區的多個分區策略

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

分區規格 API 參考

在 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)

注意

時間型函數 (yearmonthdayhour) 需要 ConversionSpec 參數來指定來源時間戳記格式。

ConversionSpec

指定來源資料的時間戳記格式的 UTF-8 字串。有效的值如下:

  • epoch_sec - 以秒為單位的 Unix epoch 時間戳記

  • epoch_milli - 以毫秒為單位的 Unix epoch 時間戳記

  • iso - ISO 8601 格式的時間戳記

分區策略

預設分區

未指定分割區資料欄時, AWS Glue Zero-ETL 會套用針對資料來源最佳化的預設分割區策略:

  • 基於主索引鍵的分區:對於具有主索引鍵的來源 (例如 DynamoDB 資料表), AWS Glue 零 ETL 會使用具有儲存貯體的主索引鍵來自動分區資料,以防止分區爆炸。

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

使用者定義的分區策略

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

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

範例身分分區範例
{ "partitionSpec": [ { "fieldName": "category", "functionSpec": "identity" } ] }

這會為「類別」欄中的每個唯一值建立單獨的分區。

警告

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

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

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

範例基於時間的分區範例
{ "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 只會將分割區資料欄值轉換為目標資料庫資料表中的時間戳記類型。轉換僅適用於分區程序。

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

範例多層分區範例
{ "partitionSpec": [ { "fieldName": "created_at", "functionSpec": "month", "conversionSpec": "iso" }, { "fieldName": "region", "functionSpec": "identity" } ] }

這會建立雙層分區結構描述:先按月 (從 "created_at" 欄),再按區域。這可實現高效查詢,按日期範圍、特定區域或這些維度的組合進行篩選。

設計多層分區方案時,請考慮:

  • 先在分區層級中首先放置選擇性較高的資料欄

  • 平衡分區精細度與分區數目

  • 將分區方案與最常見的查詢模式保持一致

最佳實務

分區資料欄選取

  • 請勿將高基數資料欄與 identity 分區函數搭配使用。使用具有身分分區的高基數資料欄會建立許多小型分區,這可能會大幅降低擷取效能。高基數資料欄可能包括:

    • 主索引鍵

    • 時間戳記欄位 (例如 LastModifiedTimestampCreatedDate)

    • 系統產生的時間戳記

  • 請勿選取同一資料欄上的多個時間戳記分區。例如:

    "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

  • 指定正確的 ConversionSpec (epoch_sec | epoch_milli | iso),代表在使用以時間戳記為基礎的分割區函數時,針對以時間戳記為基礎的分割區選擇的資料欄值格式。 AWS Glue Zero-ETL 會使用此參數,在分割之前將來源資料正確轉換為時間戳記格式。

  • 根據資料量使用適當的精細度 (year/month/day/hour)。

  • 使用 ISO 時間戳記時,請考慮時區的影響。 AWS Glue Zero-ETL 會以 UTC 時區填入所選時間戳記資料欄的所有記錄值。

錯誤處理

NEEDS_ATTENTION State

整合會在下列情況下進入 NEEDS_ATTENTION 狀態:

  • 來源中不存在指定的分區資料欄

  • 分區資料欄的時間戳記轉換失敗