複雑なネストされた JSON のシリアル化
このトピックでは、ネストデータを JSON 形式でシリアル化する方法について説明します。ネストデータは、ネストされたフィールドを含むデータです。ネストされたフィールドは、配列、構造体、オブジェクトなど、単一のエンティティとして結合されるフィールドです。
このチュートリアルで説明するメソッドの代わりに、最上位のネストされたコレクション列をシリアル化された JSON としてクエリする方法があります。シリアル化を使用して、Redshift Spectrum を使用して、ネストされたデータを JSON として検査、変換、取り込むことができます。このメソッドは、ORC、JSON、Ion、および Parquet 形式でサポートされています。セッション構成パラメータ json_serialization_enable
を使用して、シリアル化動作を構成します。設定すると、複雑な JSON データ型が VARCHAR (65535) にシリアル化されます。ネストされた JSON には JSON 関数 でアクセスできます。詳細については、「json_serialization_enable」を参照してください。
たとえば、json_serialization_enable
を設定しないと、ネストされた列に直接アクセスする次のクエリが失敗します。
SELECT * FROM spectrum.customers LIMIT 1;
=> ERROR: Nested tables do not support '*' in the SELECT clause.
SELECT name FROM spectrum.customers LIMIT 1;
=> ERROR: column "name" does not exist in customers
json_serialization_enable
を設定すると、最上位のコレクションに直接クエリを実行できます。
SET json_serialization_enable TO true;
SELECT * FROM spectrum.customers order by id LIMIT 1;
id | name | phones | orders
---+--------------------------------------+----------------+----------------------------------------------------------------------------------------------------------------------
1 | {"given": "John", "family": "Smith"} | ["123-457789"] | [{"shipdate": "2018-03-01T11:59:59.000Z", "price": 100.50}, {"shipdate": "2018-03-01T09:10:00.000Z", "price": 99.12}]
SELECT name FROM spectrum.customers order by id LIMIT 1;
name
---------
{"given": "John", "family": "Smith"}
ネストされた JSON をシリアル化するときは、以下の項目について考慮してください。
コレクション列が VARCHAR (65535) としてシリアル化されている場合、それらのネストされたサブフィールドは、クエリ構文の一部として直接アクセスできません (filter 句内など)。ただし、JSON 関数を使用して、ネストされた JSON にアクセスできます。
次の特殊な表現はサポートされていません。
ORC 組合
複合型キーを持つ ORC マップ
Ion データグラム
Ion SEXP
タイムスタンプは ISO シリアル化された文字列として返されます。
プリミティブマップキーは文字列に昇格されます (たとえば、
1
~"1"
)。最上位の null 値は NULL としてシリアル化されます。
シリアル化によって VARCHAR の最大サイズである 65535 がオーバーフローすると、セルは NULL に設定されます。
JSON 文字列を含む複合型のシリアル化
デフォルトでは、ネストされたコレクションに含まれる文字列値は、エスケープされた JSON 文字列としてシリアル化されます。文字列が有効な JSON である場合、エスケープは望ましくない場合があります。代わりに、VARCHAR であるネストされたサブ要素またはフィールドを JSON として直接記述することができます。json_serialization_parse_nested_strings
セッションレベルの設定でこの動作を有効にします。json_serialization_enable
と json_serialization_parse_nested_strings
の両方が設定されている場合、有効な JSON 値はエスケープ文字なしでインラインでシリアル化されます。値が有効な JSON でない場合、json_serialization_parse_nested_strings
設定値が設定されていないかのようにエスケープされます。詳細については、「json_serialization_parse_nested_strings」を参照してください。
たとえば、前の例のデータの name
VARCHAR(20) フィールドに structs
複合型として JSON が含まれているとします。
name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}
json_serialization_parse_nested_strings
が設定されている場合、name
列は次のようにシリアル化されます。
SET json_serialization_enable TO true;
SET json_serialization_parse_nested_strings TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;
name
---------
{"given": {"first":"John","middle":"James"}, "family": "Smith"}
次のようにエスケープされません。
SET json_serialization_enable TO true;
SELECT name FROM spectrum.customers order by id LIMIT 1;
name
---------
{"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}