COPY を使用して SUPER 列にデータをロードする - Amazon Redshift

Amazon Redshift は、2025 年 11 月 1 日以降、新しい Python UDF の作成をサポートしなくなります。Python UDF を使用する場合は、その日付より前に UDF を作成してください。既存の Python UDF は引き続き通常どおり機能します。詳細については、ブログ記事を参照してください。

COPY を使用して SUPER 列にデータをロードする

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

JSON および Avro からのデータのコピー

Amazon Redshift には、完全にまたは部分的に不明な JSON 構造であっても、COPY を使用して JSON ドキュメントを取り込むための次の方法があります。

  • noshred オプションを使用して、JSON ドキュメントから派生したデータを単一の SUPER データ列に保存します。この方法は、スキーマが不明であるか、変更が予想される場合に便利です。したがって、このメソッドを使用すると、単一の SUPER 列にタプル全体を容易に保存することができます。

  • auto または jsonpaths オプションを使用して、JSON ドキュメントを複数の Amazon Redshift 列にシュレッダー処理します。属性には、Amazon Redshift スカラーまたは SUPER 値を指定できます。

これらのオプションは、JSON 形式または Avro 形式で使用できます。noshredautojsonpaths などの JSON オプションの詳細については、「JSON format for COPY」を参照してください。

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

方法 1: noshred を使用して JSON ドキュメントを単一の SUPER データ列にコピーする

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

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

    CREATE TABLE region_nations_noshred (rdata SUPER);
  2. 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 スカラー型に変換されます。

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

    SELECT rdata FROM region_nations_noshred;

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

方法 2: JSON ドキュメントを複数の SUPER データ列にコピーする

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 );
  2. 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 データからのロード」を参照してください。

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

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

    CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super );
  2. この場合、列名は JSON 属性と一致しません。次のように、jsonpaths 配列内の位置によってテーブル列に属性のパスをマップする jsonpaths ファイルを作成できます。

    {"jsonpaths": [ "$.r_regionkey", "$.r_name", "$.r_comment", "$.r_nations ] }
  3. 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';
  4. 次のクエリを使用して、複数の列に分散されたデータを表示するテーブルにアクセスします。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);
  2. ルート jsonpath「$」を、以下のようにドキュメントのルートにマッピングします。

    {"jsonpaths": [ "$.r_regionkey", "$.r_name", "$" ] }
  3. 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」を参照してください。

テキストおよび CSV からのデータのコピー

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 からのデータのコピー

半構造化データまたはネストされたデータが 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 に変換します。