

 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/)を参照してください。

# COPY を使用して SUPER 列にデータをロードする
<a name="copy_json"></a>

以下のセクションでは、COPY コマンドを使用して JSON データを Amazon Redshift にロードするさまざまな方法について説明します。Amazon Redshift が COPY コマンドで JSON を解析するために使用するデータ形式のパラメータについては、「[データ形式パラメータ](copy-parameters-data-format.md)」の [JSON format for COPY](copy-parameters-data-format.md#copy-json) パラメータの説明を参照してください。

**Topics**
+ [JSON および Avro からのデータのコピー](#copy_json-from-JSON)
+ [テキストおよび CSV からのデータのコピー](#copy_json-from-text-csv)
+ [列形式の Parquet および ORC からのデータのコピー](#copy_json-from-parquet-orc)

## JSON および Avro からのデータのコピー
<a name="copy_json-from-JSON"></a>

Amazon Redshift には、完全にまたは部分的に不明な JSON 構造であっても、COPY を使用して JSON ドキュメントを取り込むための次の方法があります。
+ `noshred` オプションを使用して、JSON ドキュメントから派生したデータを単一の SUPER データ列に保存します。この方法は、スキーマが不明であるか、変更が予想される場合に便利です。したがって、このメソッドを使用すると、単一の SUPER 列にタプル全体を容易に保存することができます。
+ `auto` または `jsonpaths` オプションを使用して、JSON ドキュメントを複数の Amazon Redshift 列にシュレッダー処理します。属性には、Amazon Redshift スカラーまたは SUPER 値を指定できます。

これらのオプションは、JSON 形式または Avro 形式で使用できます。`noshred`、`auto`、`jsonpaths` などの JSON オプションの詳細については、「[JSON format for COPY](copy-parameters-data-format.md#copy-json)」を参照してください。

Amazon Redshift の JSON オブジェクトの最大サイズは 4 MB です。これは、シュレッダー処理または解析の前に適用されます。

### 方法 1: `noshred` を使用して JSON ドキュメントを単一の SUPER データ列にコピーする
<a name="copy_json-one-column"></a>

COPY コマンドの `noshred` オプションを使用して、JSON ドキュメント全体を単一の SUPER データ列にコピーできます。次の例を考えます。

1. 単一の SUPER データ列を持つテーブルを作成します。

   ```
   CREATE TABLE region_nations_noshred (rdata SUPER);
   ```

1. Amazon S3 から単一の SUPER データ列にデータをコピーします。JSON ソースデータを単一の SUPER データ列に取り込むには、FORMAT JSON 句で `noshred` オプションを指定します。

   ```
   COPY region_nations_noshred FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation'
   REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
   FORMAT JSON 'noshred';
   ```

   COPY が JSON を正常に取り込んだ後のテーブルには、JSON オブジェクト全体のデータを含む `rdata` SUPER データ列があります。取り込まれたデータは、JSON 階層のすべてのプロパティを保持します。ただし、効率的なクエリ処理のために、リーフは Amazon Redshift スカラー型に変換されます。

1. 次のクエリを使用して、元の JSON 文字列を取得します。

   ```
   SELECT rdata FROM region_nations_noshred;
   ```

   Amazon Redshift が SUPER データ列を生成すると、JSON シリアル化によって JDBC を文字列として使用してアクセスできるようになります。詳細については、「[複雑なネストされた JSON のシリアル化](serializing-complex-JSON.md)」を参照してください。

### 方法 2: JSON ドキュメントを複数の SUPER データ列にコピーする
<a name="copy_json-multiple-columns"></a>

JSON ドキュメントは、SUPER データ列または Amazon Redshift スカラー型のいずれかである複数の列に細分家できます。Amazon Redshift は、JSON オブジェクトのさまざまな部分を異なる列に分散します。次の例を考えます。

1. シュレッダー処理された JSON を保持する複数の列を含むテーブルを作成します。

   ```
   CREATE TABLE region_nations
   (
    r_regionkey smallint
    ,r_name varchar
    ,r_comment varchar
    ,r_nations super
    );
   ```

1. JSON を `region_nations` テーブルにコピーするには、FORMAT JSON 句で AUTO オプションを指定して、JSON 値を複数の列に分割します。COPY は、最上位の JSON 属性を列名と照合し、ネストされた値を JSON 配列やオブジェクトなどの SUPER 値として取り込むことができます。

   ```
   COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation'
   REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
   FORMAT JSON 'auto';
   ```

   JSON 属性名が大文字と小文字が混在する場合は、FORMAT JSON 句の中で `auto ignorecase` オプションを指定します。COPY コマンドの詳細については、「['auto ignorecase' オプションを使用した JSON データからのロード](r_COPY_command_examples.md#copy-from-json-examples-using-auto-ignorecase)」を参照してください。

場合によっては、列名と JSON 属性の間に不一致があるか、ロードする属性がレベルより深くネストされていることがあります。その場合は、`jsonpaths` ファイルを使用して JSON 属性を Amazon Redshift 列に手動でマッピングします。次の例を考えます。

1. シュレッダー処理された JSON を保持する複数の列を含むテーブルを作成します。

   ```
   CREATE TABLE region_nations
   (
    r_regionkey smallint
    ,r_name varchar
    ,r_comment varchar
    ,r_nations super
    );
   ```

1. この場合、列名は JSON 属性と一致しません。次のように、`jsonpaths` 配列内の位置によってテーブル列に属性のパスをマップする `jsonpaths` ファイルを作成できます。

   ```
   {"jsonpaths": [
          "$.r_regionkey",
          "$.r_name",
          "$.r_comment",
          "$.r_nations
       ]
   }
   ```

1. COPY の FORMAT JSON の引数として `jsonpaths` ファイルの場所を使用します。

   ```
   COPY nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation'
   REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
   FORMAT JSON 's3://redshift-downloads/semistructured/tpch-nested/data/jsonpaths/nations_jsonpaths.json';
   ```

1. 次のクエリを使用して、複数の列に分散されたデータを表示するテーブルにアクセスします。SUPER データ列は、JSON 形式を使用して印刷されます。

   ```
   SELECT r_regionkey,r_name,r_comment,r_nations[0].n_nationkey FROM region_nations ORDER BY 1,2,3 LIMIT 1;
   ```

`jsonpaths` ファイルは、JSON ドキュメント内のフィールドをテーブル列にマップします。SUPER 列として完全なドキュメントをロードしながら、分散キーおよびソートキーなどの追加の列を抽出できます。以下のクエリは、完全なドキュメントを `nations` 列にロードします。`name` 列はソートキーで、`regionkey` 列は分散キーです。次の例を考えます。

1. シュレッダー処理された JSON を保持する複数の列を含むテーブルを作成します。

   ```
   CREATE TABLE nations_sorted (
       regionkey smallint,
       name varchar,
       nations super
   ) DISTKEY(regionkey) SORTKEY(name);
   ```

1. ルート jsonpath「\$1」を、以下のようにドキュメントのルートにマッピングします。

   ```
   {"jsonpaths": [
          "$.r_regionkey",
          "$.r_name",
          "$"
       ]
   }
   ```

1. COPY の FORMAT JSON の引数として `jsonpaths` ファイルの場所を使用します。

   ```
   COPY nations_sorted FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation'
   REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
   FORMAT JSON 's3://redshift-downloads/semistructured/tpch-nested/data/jsonpaths/nations_sorted_jsonpaths.json';
   ```

`jsonpaths` の使用の詳細については、「[JSON 形式からの COPY](copy-usage_notes-copy-from-json.md)」を参照してください。

## テキストおよび CSV からのデータのコピー
<a name="copy_json-from-text-csv"></a>

Amazon Redshift は、シリアルナンバーが付けられた JSON として、テキスト形式および CSV 形式の SUPER 列を表します。SUPER 列が正しい型情報をロードするには、有効な JSON フォーマットが必要です。オブジェクト、配列、数値、ブール値、およびNULL値の引用符を外します。文字列値を二重引用符で囲みます。SUPER 列は、テキストおよび CSV 形式に標準のエスケープ規則を使用します。

 CSV からコピーする場合、区切り文字は CSV 標準に従ってエスケープされます。次の例を考えます。

```
CREATE TABLE region_nations
(
 r_regionkey smallint
 ,r_name varchar
 ,r_comment varchar
 ,r_nations super
 );
 
 COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/csv/region_nation'
REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
FORMAT CSV;
```

テキストからコピーする場合、選択した区切り文字が SUPER フィールドにも表示される可能性がある場合は、COPY および UNLOAD 中に ESCAPE オプションを使用します。次の例を考えます。

```
CREATE TABLE region_nations
(
 r_regionkey smallint
 ,r_name varchar
 ,r_comment varchar
 ,r_nations super
 );
 
COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/text/region_nation'
REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
DELIMITER ','
ESCAPE;
```

## 列形式の Parquet および ORC からのデータのコピー
<a name="copy_json-from-parquet-orc"></a>

半構造化データまたはネストされたデータが Apache Parquet または Apache ORC 形式で既に使用可能な場合は、COPY コマンドを使用して Amazon Redshift にデータを取り込むことができます。

Amazon Redshift テーブル構造は、Parquet ファイルまたは ORC ファイルの列数と列データ型と一致する必要があります。COPY コマンドで SERIALIZETOJSON を指定することにより、テーブルの SUPER 列と整列するファイル内の任意の列タイプを SUPER としてロードできます。これには、構造体型と配列型が含まれます。

次の例では、Parquet 形式を使用します。

```
COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/parquet/region_nation'
REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
FORMAT PARQUET SERIALIZETOJSON;
```

次の例では、ORC 形式を使用します。

```
COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/orc/region_nation'
IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3'
FORMAT ORC SERIALIZETOJSON;
```

日付または時刻のデータ型の属性が ORC の場合、Amazon Redshift はそれらを SUPER でエンコードするときに varchar に変換します。