メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

JSON 形式からの COPY

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

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

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

Copy
{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service 開発者ガイド" }

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

Copy
[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service 開発者ガイド" ]

COPY で 'auto' オプションを指定して JSON ファイルから自動的にフィールドを読み込むか、COPY が JSON ソースデータの解析に使用する JSONPaths ファイルを指定できます。JSONPaths ファイルは、JSONPath 式の配列とペアになった "jsonpaths" という名前の単一の JSON オブジェクトを格納するテキストファイルです。名前が "jsonpaths" 以外の文字列である場合、COPY は JSONPaths ファイルの代わりに 'auto' 引数を使用します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JSON のエスケープ文字

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

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

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

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

Copy
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 テーブルにクエリを実行し、結果を表示します。

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

このページの内容: