

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

# 結構描述解除巢狀化
<a name="zero-etl-ddb-schema-unnesting"></a>

 透過零 ETL 與分析服務整合時，您可以選擇巢狀結構在目標資料表中的呈現方式。 AWS Glue 零 ETL 提供結構描述解巢狀選項，將複雜的資料結構扁平化為更易於分析的格式。

## 將選項解除巢狀化
<a name="unnesting-options"></a>

 建立與來源的零 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 資料具有可變或深度巢狀結構，則完全解除巢狀可能會導致資料表非常大且具有許多資料欄。

**Example 在 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",
      }
  }'
```

## 解除巢狀化範例
<a name="unnesting-examples"></a>

 考慮具有下列結構的 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 範例
<a name="no-unnesting-example"></a>

 使用 NO\_UNNEST 時，整個資料列會存放在一欄中加上主索引鍵。DynamoDB 類型資訊會保留。這可維持與 Redshift 查詢模式的相容性。

產生的 Iceberg 資料表 （假設 col\_1 是主索引鍵）：


| col\_1 （字串） | 值 （結構） | 
| --- | --- | 
| value\_1 | <pre>{<br />  "col_2": {<br />    "M": {<br />      "col_3": {<br />        "M": {<br />          "id": {<br />            "S": "value_3"<br />          }<br />        }<br />      },<br />      "col_4": {<br />        "BOOL": true<br />      }<br />    }<br />  }<br />}</pre> | 

查詢需要使用 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 範例
<a name="unnest-one-level-example"></a>

 使用 TOP\_LEVEL，只有最上層欄位不會巢狀化，同時保持巢狀欄位作為結構。DynamoDB 類型資訊會移除並維護輸入。在發生結構描述衝突時轉換為字串類型。

複寫後產生的 Glue 資料表：


| col\_1 （字串） | col\_2 （結構） | 
| --- | --- | 
| value\_1 | <pre>{<br />  "col_3": {<br />    "id": "value_3"<br />  },<br />  "col_4": true<br />}</pre> | 

會簡化第一級的查詢：

```
SELECT 
  col_1, 
  col_2.col_3.id,
  col_2.col_4
FROM product_table;
```

### 完整範例
<a name="unnest-all-levels-example"></a>

 完全解除巢狀時，最上層欄位和巢狀結構/貼圖欄位都會扁平化。點表示法用於巢狀欄位 （例如 "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;
```