

# 架构取消嵌套
<a name="zero-etl-ddb-schema-unnesting"></a>

 通过零 ETL 与分析服务集成时，可选择如何在目标表中表示嵌套结构。AWSGlue 零 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" | 忽略 | 
| "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> | 

查询可能需要使用结构和数组访问模式：

```
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;
```

### FULL 示例
<a name="unnest-all-levels-example"></a>

 使用 FULL 解嵌套选项时，顶层字段和嵌套结构体/映射字段都将解开。嵌套字段使用点表示法（例如，“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;
```