半構造化データを Amazon Redshift にロードする - Amazon Redshift

半構造化データを Amazon Redshift にロードする

SUPER データ型を使用して、Amazon Redshift の階層データと汎用データを永続化およびクエリします。Amazon Redshift は JSON 形式のデータを解析して SUPER 表現に変換する json_parse 関数が導入されています。Amazon Redshift は COPY コマンドを使用した SUPER 列のロードもサポートしています。サポートされているファイル形式は、JSON、Avro、テキスト、コンマ区切り値 (CSV) 形式、Parquet、および ORC 形式です。

次の例で使用されるテーブルの詳細については、「SUPER サンプルデータセット」を参照してください。

json_parse 関数の詳細については、「JSON_PARSE 関数」を参照してください。

SUPER データ型のデフォルトのエンコードは ZSTD です。

JSON ドキュメントを SUPER 列で解析する

json_parse 関数を使用すると、SUPER 列に JSON データを挿入または更新できます。この関数は、データを JSON 形式で解析し、SUPER データ型に変換します。SUPER データ型は INSERT ステートメントまたは UPDATE ステートメントで使用できます。

次の例では、JSON データを SUPER 列に挿入します。json_parse 関数がクエリに含まれていない場合、Amazon Redshift は関連する値を、解析する必要がある JSON 形式の文字列ではなく単一の文字列として扱います。

SUPER データ列を更新する場合、Amazon Redshift では、ドキュメント全体を列の値に渡す必要があります。Amazon Redshift は、部分的な更新をサポートしていません。

INSERT INTO region_nations VALUES(0, 'lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to', 'AFRICA', JSON_PARSE('{"r_nations":[ {"n_comment":" haggle. carefully final deposits detect slyly agai", "n_nationkey":0, "n_name":"ALGERIA" }, {"n_comment":"ven packages wake quickly. regu", "n_nationkey":5, "n_name":"ETHIOPIA" }, {"n_comment":" pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t", "n_nationkey":14, "n_name":"KENYA" }, {"n_comment":"rns. blithely bold courts among the closely regular packages use furiously bold platelets?", "n_nationkey":15, "n_name":"MOROCCO" }, {"n_comment":"s. ironic, unusual asymptotes wake blithely r", "n_nationkey":16, "n_name":"MOZAMBIQUE" } ] }'));

COPY を使用して Amazon Redshift で SUPER 列をロードする

以下のセクションでは、COPY コマンドを使用して JSON データを Amazon Redshift にロードするさまざまな方法について説明します。

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

Amazon Redshift で半構造化データサポートを使用すると、JSON 構造の属性を複数の列にシュレッダー処理することなく JSON ドキュメントをロードできます。

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

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

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

これらのオプションは、JSON 形式または Avro 形式で使用できます。

シュレッダー処理前の JSON オブジェクトの最大サイズは 4 MB です。

JSON ドキュメントを単一の SUPER データ列にコピーする

JSON ドキュメントを単一の SUPER データ列にコピーするには、単一の SUPER データ列を持つテーブルを作成します。

CREATE TABLE region_nations_noshred (rdata SUPER);

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 スカラー型に変換されます。

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

SELECT rdata FROM region_nations_noshred;

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

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

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

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

前の例のデータをテーブルにコピーするには、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 列に手動でマッピングします。

CREATE TABLE nations ( regionkey smallint ,name varchar ,comment super ,nations super );

列名が JSON 属性と一致しないテーブルにデータをロードするとします。次の例では、nations テーブルがそのようなテーブルです。jsonpaths 配列内の位置によってテーブル列に属性のパスをマップする jsonpaths ファイルを作成できます。

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

jsonpaths ファイルの場所は、FORMAT JSON の引数として使用されます。

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';

次のクエリを使用して、複数の列に分散されたデータを表示するテーブルにアクセスします。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 列は分散キーです。

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

ルート jsonpath「$」は、以下のようにドキュメントのルートにマップされます。

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

jsonpaths ファイルの場所は、FORMAT JSON の引数として使用されます。

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';

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

Amazon Redshift は、シリアルナンバーが付けられた JSON として、テキスト形式および CSV 形式の SUPER 列を表します。SUPER 列が正しい型情報をロードするには、有効な JSON フォーマットが必要です。オブジェクト、配列、数値、ブール値、およびNULL値の引用符を外します。文字列値を二重引用符で囲みます。SUPER 列は、テキストおよび CSV 形式に標準のエスケープ規則を使用します。CSV の場合、区切り文字は CSV 標準に従ってエスケープされます。テキスト形式の場合、選択した区切り文字が SUPER フィールドにも表示される可能性がある場合は、COPY および UNLOAD 中に ESCAPE オプションを使用します。

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;
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 としてロードできます。これには、構造体型と配列型が含まれます。

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 に変換します。