View a markdown version of this page

結構描述解除巢狀化 - AWS Glue

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

結構描述解除巢狀化

透過零 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
{ "col_2": { "M": { "col_3": { "M": { "id": { "S": "value_3" } } }, "col_4": { "BOOL": true } } } }

查詢需要使用 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
{ "col_3": { "id": "value_3" }, "col_4": true }

會簡化第一級的查詢:

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;