

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# 複雑なネストされた JSON のシリアル化
<a name="serializing-complex-JSON"></a>

このトピックでは、ネストデータを JSON 形式でシリアル化する方法について説明します。ネストデータは、ネストされたフィールドを含むデータです。ネストされたフィールドは、配列、構造体、オブジェクトなど、単一のエンティティとして結合されるフィールドです。

このチュートリアルで説明するメソッドの代わりに、最上位のネストされたコレクション列をシリアル化された JSON としてクエリする方法があります。シリアル化を使用して、Redshift Spectrum を使用して、ネストされたデータを JSON として検査、変換、取り込むことができます。このメソッドは、ORC、JSON、Ion、および Parquet 形式でサポートされています。セッション構成パラメータ `json_serialization_enable` を使用して、シリアル化動作を構成します。設定すると、複雑な JSON データ型が VARCHAR (65535) にシリアル化されます。ネストされた JSON には [JSON 関数](json-functions.md) でアクセスできます。詳細については、「[json\$1serialization\$1enable](r_json_serialization_enable.md)」を参照してください。

たとえば、`json_serialization_enable` を設定しないと、ネストされた列に直接アクセスする次のクエリが失敗します。

```
SELECT * FROM spectrum.customers LIMIT 1;

=> ERROR:  Nested tables do not support '*' in the SELECT clause.

SELECT name FROM spectrum.customers LIMIT 1;

=> ERROR:  column "name" does not exist in customers
```

`json_serialization_enable` を設定すると、最上位のコレクションに直接クエリを実行できます。

```
SET json_serialization_enable TO true;

SELECT * FROM spectrum.customers order by id LIMIT 1;

id | name                                 | phones         | orders
---+--------------------------------------+----------------+----------------------------------------------------------------------------------------------------------------------
1  | {"given": "John", "family": "Smith"} | ["123-457789"] | [{"shipdate": "2018-03-01T11:59:59.000Z", "price": 100.50}, {"shipdate": "2018-03-01T09:10:00.000Z", "price": 99.12}]          
 
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": "John", "family": "Smith"}
```

ネストされた JSON をシリアル化するときは、以下の項目について考慮してください。
+ コレクション列が VARCHAR (65535) としてシリアル化されている場合、それらのネストされたサブフィールドは、クエリ構文の一部として直接アクセスできません (filter 句内など)。ただし、JSON 関数を使用して、ネストされた JSON にアクセスできます。
+ 次の特殊な表現はサポートされていません。
  + ORC 組合
  + 複合型キーを持つ ORC マップ
  + Ion データグラム
  + Ion SEXP
+ タイムスタンプは ISO シリアル化された文字列として返されます。
+ プリミティブマップキーは文字列に昇格されます (たとえば、`1`～`"1"`)。
+ 最上位の null 値は NULL としてシリアル化されます。
+ シリアル化によって VARCHAR の最大サイズである 65535 がオーバーフローすると、セルは NULL に設定されます。

## JSON 文字列を含む複合型のシリアル化
<a name="serializing-complex-JSON-strings"></a>

デフォルトでは、ネストされたコレクションに含まれる文字列値は、エスケープされた JSON 文字列としてシリアル化されます。文字列が有効な JSON である場合、エスケープは望ましくない場合があります。代わりに、VARCHAR であるネストされたサブ要素またはフィールドを JSON として直接記述することができます。`json_serialization_parse_nested_strings` セッションレベルの設定でこの動作を有効にします。`json_serialization_enable` と `json_serialization_parse_nested_strings` の両方が設定されている場合、有効な JSON 値はエスケープ文字なしでインラインでシリアル化されます。値が有効な JSON でない場合、`json_serialization_parse_nested_strings` 設定値が設定されていないかのようにエスケープされます。詳細については、「[json\$1serialization\$1parse\$1nested\$1strings](r_json_serialization_parse_nested_strings.md)」を参照してください。

たとえば、前の例のデータの `name` VARCHAR(20) フィールドに `structs` 複合型として JSON が含まれているとします。

```
name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}
```

`json_serialization_parse_nested_strings` が設定されている場合、`name` 列は次のようにシリアル化されます。

```
SET json_serialization_enable TO true;
SET json_serialization_parse_nested_strings TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": {"first":"John","middle":"James"}, "family": "Smith"}
```

次のようにエスケープされません。

```
SET json_serialization_enable TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;

name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}
```