本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資料分割
什麼是資料分區?
資料分區是一種技術,可將大型資料集分成更小、更易於管理的區段,稱為分區。在 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)
注意
時間型函數 (
year、month、day、hour) 需要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分區函數搭配使用。使用具有身分分區的高基數資料欄會建立許多小型分區,這可能會大幅降低擷取效能。高基數資料欄可能包括:-
主索引鍵
-
時間戳記欄位 (例如
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
-
指定正確的 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 狀態:
來源中不存在指定的分區資料欄
分區資料欄的時間戳記轉換失敗