JSON 形式からの COPY - Amazon Redshift

JSON 形式からの COPY

JSON のデータ構造は、一連のオブジェクトまたは配列により構成されています。JSON オブジェクトの先頭と末尾には中括弧が付き、順序が設定されていない一連の名前と値のペアが含まれます。各名前と値はコロンで区切られ、ペアはカンマで区切られます。名前は二重引用符で囲まれた文字列です。引用符は、傾きの付いた「高機能な」引用符ではなくシンプルな引用符 (0x22) にする必要があります。

JSON 配列の先頭と末尾には角括弧が付き、順序が設定された一連のカンマ区切りの値が含まれます。値には、二重引用符で囲まれた文字列、数値、ブール値の true または false、Null、JSON オブジェクト、配列を指定できます。

JSON のオブジェクトと配列を入れ子にして、階層データ構造を実現できます。次の例は、2 つの有効なオブジェクトを持つ JSON データ構造を示しています。

{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service User Guide" }

2 つの JSON 配列と同じデータを次に示します。

[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service User Guide" ]

JSON の COPY オプション

JSON 形式のデータで COPY を使用する場合は、次のオプションを指定できます。

  • 'auto' – COPY は JSON ファイルからフィールドを自動的にロードします。

  • 'auto ignorecase' – COPY は、フィールド名の大文字と小文字を区別せずに、JSON ファイルからフィールドを自動的にロードします。

  • s3://jsonpaths_file – COPY は JSONPaths ファイルを使用して JSON ソースデータを解析します。JSONPaths ファイルは、JSONPath 式の配列とペアになった "jsonpaths" という名前の単一の JSON オブジェクトを格納するテキストファイルです。名前が "jsonpaths" 以外の文字列である場合、COPY は JSONPaths ファイルの代わりに 'auto' 引数を使用します。

'auto''auto ignorecase'、または JSONPaths ファイルを使用し、JSON オブジェクトまたは配列のいずれかを使用してデータをロードする方法を示す例については、JSON からのコピーの例 を参照してください。

JSONPath オプション

Amazon Redshift COPY 構文では、JSONPath 式は、角括弧表記またはドット表記のいずれかを使用して、JSON の階層データ構造内の 1 つの名前要素に対する明示的なパスを指定します。Amazon Redshift では、あいまいなパスや複数の名前要素に解決される可能性がある、ワイルドカード文字やフィルター式などの JSONPath 要素をサポートしていません。その結果、Amazon Redshift は複雑な複数レベルのデータ構造を解析することはできません。

次は、ブラケット表記を使用した JSONPath 式を含む JSONPaths ファイルの例です。ドル記号 ($) はルートレベル構造を現します。

{ "jsonpaths": [ "$['id']", "$['store']['book']['title']", "$['location'][0]" ] }

前の例で、$['location'][0]は配列内の最初の要素を参照します。JSON はゼロベースの配列インデックス付けを使用します。配列インデックスは正の整数 (0 以上) である必要があります。

次の例は、前出の JSONPaths ファイルをドット表記で表したものです。

{ "jsonpaths": [ "$.id", "$.store.book.title", "$.location[0]" ] }

jsonpaths 配列でブラケット表記とドット表記を混在させることはできません。ブラケットは、配列要素を参照するためにブラケット表記とドット表記の両方で使用できます。

ドット表記を使用する場合、JSONPath の式は以下の文字を含む必要があります。

  • 1 つの一重引用符 ( ' )

  • ピリオドまたはドット (.)

  • 配列要素を参照するために使用されていない場合はブラケット ( [ ] )

JSONPath 式によって参照される名前と値のペアの値がオブジェクトまたは配列の場合は、中括弧または角括弧を含むオブジェクトまたは配列全体が文字列としてロードされます。例えば、JSON データに次のオブジェクトが含まれているとします。

{ "id": 0, "guid": "84512477-fa49-456b-b407-581d0d851c3c", "isActive": true, "tags": [ "nisi", "culpa", "ad", "amet", "voluptate", "reprehenderit", "veniam" ], "friends": [ { "id": 0, "name": "Martha Rivera" }, { "id": 1, "name": "Renaldo" } ] }

この場合、JSONPath 式 $['tags'] は次の値を返します。

"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]"

この場合、JSONPath 式 $['friends'][1] は次の値を返します。

"{"id": 1,"name": "Renaldo"}"

jsonpaths 配列の各 JSONPath 式は、Amazon Redshift のターゲットテーブル内の 1 列に対応しています。jsonpaths 配列要素の順序は、ターゲットテーブル内の列の順序または列リストが使用される場合は列リスト内の列の順序と一致していなければなりません。

'auto' 引数または JSONPaths ファイルを使用し、JSON オブジェクトまたは配列のいずれかを使用してデータをロードする方法を示す例については、「JSON からのコピーの例」を参照してください。

複数の JSON ファイルをコピーする方法については、マニフェストを使用し、データファイルを指定する を参照してください。

JSON のエスケープ文字

COPY は改行文字として \n を、タブ文字として \t をロードします。バックスラッシュをロードするには、バックスラッシュをバックスラッシュでエスケープします (\\)。

たとえば、バケット escape.json 内の s3://mybucket/json/ という名前のファイルに、次の JSON があるとします。

{ "backslash": "This is a backslash: \\", "newline": "This sentence\n is on two lines.", "tab": "This sentence \t contains a tab." }

ESCAPES テーブルを作成し JSON をロードするには、次のコマンドを実行します。

create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35)); copy escapes from 's3://mybucket/json/escape.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as json 'auto';

ESCAPES テーブルにクエリを実行し、結果を表示します。

select * from escapes; backslash | newline | tab ------------------------+-------------------+---------------------------------- This is a backslash: \ | This sentence | This sentence contains a tab. : is on two lines. (1 row)

数値の精度の喪失

JSON 形式のデータファイルから数値データ型として定義された列に数値をロードするときに、精度が失われる可能性があります。一部の浮動小数点値は、コンピュータシステムで正確に表されません。そのため、JSON ファイルからコピーするデータは、想定したとおりに丸められない可能性があります。精度の喪失を避けるため、次のいずれかの代替策を使用することをお勧めします。

  • 二重引用文字で値を囲んで、数値を文字列として表します。

  • ROUNDEC を使用して、数値を切り捨てるのではなく丸めます。

  • JSON または Avro ファイルを使用する代わりに、CSV、文字区切り形式、または固定幅形式のテキストファイルを使用します。