

# Desaninhamento de esquemas
<a name="zero-etl-ddb-schema-unnesting"></a>

 Ao fazer a integração com serviços de analytics por meio do ETL zero, você pode escolher como as estruturas aninhadas são representadas nas tabelas de destino. AWS O ETL zero do Glue fornece opções de desaninhamento de esquemas para nivelar estruturas de dados complexas em formatos mais fáceis de analisar. 

## Opções de desaninhamento
<a name="unnesting-options"></a>

 Ao criar uma integração ETL zero com uma fonte, você pode escolher entre as seguintes opções de desaninhamento. Essas opções correspondem aos valores de enumeração específicos que você usará ao chamar a API CreateIntegrationTableProperty. Para todas as opções não aninhadas, percorreremos até a camada mais interna e mapearemos o tipo do DDB para o tipo primitivo correspondente do Spark/Iceberg da melhor forma possível. O mapeamento de tipos entre o DDB de origem e a tabela de destino é o seguinte: 


| Tipo de dados de origem DDB | Tipo de dados da tabela de destino | 
| --- | --- | 
| "S" | StringType | 
| "B" | BinaryType | 
| "N" | DoubleType | 
| "BOOL" | BooleanType | 
| "SS" | ArrayType(StringType) | 
| "NS" | ArrayType(DoubleType) | 
| "BS" | ArrayType(BinaryType) | 
| "L" | ArrayType(StringType) | 
| "NULL" | Ignorar | 
| "M" | StructType (TOP/NOUNNEST) | 

Sem desaninhamento: NO\_UNNEST  
 **Valor da API: `NO_UNNEST`**   
 Preserva a estrutura aninhada original dos itens do Amazon DynamoDB. Mapas e listas são armazenados como colunas estruturadas no destino.   
 Ideal para: preservar a estrutura exata dos seus dados do Amazon DynamoDB quando suas ferramentas de analytics podem funcionar com dados aninhados. 

Nível superior: TOP\_LEVEL  
 **Valor da API: `TOP_LEVEL`**   
 Achatamento do nível superior dos mapas aninhados em colunas individuais. As estruturas de lista permanecem aninhadas.   
 Preserva a estrutura exata dos seus dados do Amazon DynamoDB quando suas ferramentas de analytics podem funcionar com dados aninhados com todas as informações do tipo DDB removidas.   
 Ideal para: equilibrar a preservação da estrutura de dados e a simplicidade da consulta quando seus itens da tabela do Amazon DynamoDB têm um esquema consistente. 

Desaninhar todos os níveis: FULL (padrão)  
 **Valor da API: `FULL`**   
 Achatamento recursivo de todas as estruturas aninhadas (mapas e listas) em colunas individuais com notação de pontos para nomeação.   
 Ideal para: maximizar a simplicidade das consultas ao trabalhar com estruturas profundamente aninhadas e ferramentas de analytics que preferem esquemas simples.   
 O desaninhamento total pode resultar em tabelas muito amplas com muitas colunas se seus dados do DynamoDB tiverem estruturas variáveis ou profundamente aninhadas. 

**Example Usar opções de desaninhamento na API**  
 Ao configurar o desaninhamento do esquema por meio da API CreateIntegrationTableProperty, especifique a opção de desaninhamento no parâmetro 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",
      }
  }'
```

## Exemplos de desaninhamento
<a name="unnesting-examples"></a>

 Considere um item do DynamoDB com a seguinte estrutura: 

```
// Input DynamoDB Record
{
  "Item": {
    "col_1": {
      "S": "value_1"
    },
    "col_2": {
      "M": {
        "col_3": {
          "M": {
            "id": {
              "S": "value_3"
            }
          }
        },
        "col_4": {
          "BOOL": true
        }
      }
    }
  }
}
```

### Exemplo de NO\_UNNEST
<a name="no-unnesting-example"></a>

 Com NO\_UNNEST, a linha inteira é armazenada em uma coluna mais a chave primária. As informações do tipo DynamoDB são preservadas. Isso mantém a compatibilidade com os padrões de consulta do Redshift. 

Tabela Iceberg resultante (presumindo que col\_1 seja a chave primária):


| col\_1 (string) | valor (struct) | 
| --- | --- | 
| 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> | 

As consultas precisariam usar padrões de acesso de estrutura e array:

```
SELECT 
  value.col_1,
  value.col_2.M.col_3.M.id.S,
  value.col_2.M.col_4.BOOL
FROM product_table;
```

### Exemplo de TOP\_LEVEL
<a name="unnest-one-level-example"></a>

 Com o TOP\_LEVEL, somente os campos de nível superior não são aninhados, mantendo os campos aninhados intactos como structs. As informações de tipo do DynamoDB são removidas e a digitação é mantida. Converte para o tipo string quando ocorrem conflitos de esquema. 

Tabela do Glue resultante após a replicação:


| col\_1 (string) | col\_2 (struct) | 
| --- | --- | 
| value\_1 | <pre>{<br />  "col_3": {<br />    "id": "value_3"<br />  },<br />  "col_4": true<br />}</pre> | 

As consultas seriam simplificadas para o primeiro nível:

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

### Exemplo de FULL
<a name="unnest-all-levels-example"></a>

 Com o desaninhamento FULL, os campos de nível superior e os campos de struct/map aninhados são nivelados. A notação de pontos é usada para campos aninhados (p. ex., “col\_2.col\_3.id”). Os elementos array permanecem não aninhados. Cada nó folha torna-se uma coluna de nível superior. 

Tabela do Glue resultante após a replicação:


| col\_1 (string) | col\_2.col\_3.id (string) | col\_2.col\_4 (booleano) | 
| --- | --- | --- | 
| value\_1 | value\_3 | TRUE | 

As consultas seriam totalmente achatadas:

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