

# スキーマのネスト解除
<a name="zero-etl-ddb-schema-unnesting"></a>

 ゼロ ETL を介して分析サービスと統合する場合、ネストされた構造をターゲットテーブルでどのように表現するかを選択できます。AWSGlue Zero-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 では、プライマリキーがある 1 つの列に行全体が格納されます。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> | 

クエリは第 1 レベルで簡略化されます。

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

### FULL の例
<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;
```