本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
結構描述解除巢狀化
透過零 ETL 與分析服務整合時,您可以選擇巢狀結構在目標資料表中的呈現方式。 AWS Glue 零 ETL 提供結構描述解巢狀選項,將複雜的資料結構扁平化為更易於分析的格式。
將選項解除巢狀化
建立與來源的零 ETL 整合時,可以從下列解除巢狀化選項中選擇。這些選項對應於您在呼叫 CreateIntegrationTableProperty API 時使用的特定列舉值。對於所有非巢狀選項,我們會周遊到大多數內部層,並盡最大努力將 DDB 類型映射到目標 spark/iceberg 基本類型。來源 DDB 和目標資料表之間的類型映射如下所示:
| DDB 來源資料類型 | 目標資料表資料類型 |
|---|---|
"S" | StringType |
"B" | BinaryType |
"N" | DoubleType |
"BOOL" | BooleanType |
"SS" | ArrayType(StringType) |
"NS" | ArrayType(DoubleType) |
"BS" | ArrayType(BinaryType) |
"L" | ArrayType(StringType) |
"NULL" | Ignore |
"M" | StructType (TOP/NOUNNEST) |
- 無解除巢狀化 - NO_UNNEST
-
API 值:
NO_UNNEST保留 Amazon DynamoDB 項目的原始巢狀結構。地圖和清單會以結構化資料欄的形式存放在目標中。
最適合:當分析工具可以使用巢狀資料時,保留 Amazon DynamoDB 資料的確切結構。
- 頂層 - TOP_LEVEL
-
API 值:
TOP_LEVEL將頂層巢狀地圖扁平化為單個資料欄。清單結構保持巢狀。
當您的分析工具可以使用巢狀資料並移除所有 DDB 類型資訊時, 會保留 Amazon DynamoDB 資料的確切結構。
最適合:當您的 Amazon DynamoDB 資料表項目具有一致的結構描述時,在資料結構保留和查詢簡單性之間取得平衡。
- 將所有關卡巢狀化 - FULL (預設)
-
API 值:
FULL將所有巢狀結構 (地圖和清單) 遞迴地扁平化為單個資料欄,其使用點表示法進行命名。
最適合:使用偏好平面結構描述的深度巢狀結構和分析工具時,最大限度地提高查詢簡單性。
注意
如果 DynamoDB 資料具有可變或深度巢狀結構,則完全解除巢狀可能會導致資料表非常大且具有許多資料欄。
範例在 API 中使用解除巢狀選項
透過 CreateIntegrationTableProperty API 設定結構描述解除巢狀時,請在 UnnestSpec 參數中指定解除巢狀選項:
aws glue create-integration-table-property --resource-arn "arn:aws:glue:us-east-1:123456789012:database/my_db" --table-name "my-table" --cli-input-json '{ "TargetTableConfig": { "UnnestSpec": "FULL", "TargetTableName": "my-target-table", } }'
解除巢狀化範例
考慮具有下列結構的 DynamoDB 項目:
// Input DynamoDB Record { "Item": { "col_1": { "S": "value_1" }, "col_2": { "M": { "col_3": { "M": { "id": { "S": "value_3" } } }, "col_4": { "BOOL": true } } } } }
NO_UNNEST 範例
使用 NO_UNNEST 時,整個資料列會存放在一欄中加上主索引鍵。DynamoDB 類型資訊會保留。這可維持與 Redshift 查詢模式的相容性。
產生的 Iceberg 資料表 (假設 col_1 是主索引鍵):
| col_1 (字串) | 值 (結構) |
|---|---|
| value_1 |
|
查詢需要使用 struct 和陣列存取模式:
SELECT value.col_1, value.col_2.M.col_3.M.id.S, value.col_2.M.col_4.BOOL FROM product_table;
TOP_LEVEL 範例
使用 TOP_LEVEL,只有最上層欄位不會巢狀化,同時保持巢狀欄位作為結構。DynamoDB 類型資訊會移除並維護輸入。在發生結構描述衝突時轉換為字串類型。
複寫後產生的 Glue 資料表:
| col_1 (字串) | col_2 (結構) |
|---|---|
| value_1 |
|
會簡化第一級的查詢:
SELECT col_1, col_2.col_3.id, col_2.col_4 FROM product_table;
完整範例
完全解除巢狀時,最上層欄位和巢狀結構/貼圖欄位都會扁平化。點表示法用於巢狀欄位 (例如 "col_2.col_3.id")。陣列元素保持不變。每個分葉節點都會成為最上層資料欄。
複寫後產生的 Glue 資料表:
| col_1 (字串) | col_2.col_3.id (字串) | col_2.col_4 (布林值) |
|---|---|---|
| value_1 | value_3 | TRUE |
查詢會完全扁平化:
SELECT col_1, "col_2.col_3.id", "col_2.col_4" FROM product_table;