複雑なネストされた JSON のシリアル化 - Amazon Redshift

複雑なネストされた 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_enablejson_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"}