Serialisieren komplexer verschachtelter JSON-Datentypen - Amazon Redshift

Serialisieren komplexer verschachtelter JSON-Datentypen

Eine Alternative zu den in diesem Tutorial demonstrierten Methoden besteht darin, verschachtelte Sammlungsspalten der obersten Ebene als serialisierten JSON-Datentyp abzufragen. Sie können die Serialisierung verwenden, um verschachtelte Daten als JSON mit Redshift Spectrum zu untersuchen, zu konvertieren und aufzunehmen. Diese Methode wird für ORC-, JSON-, Ion- und Parquet-Formate unterstützt. Verwenden Sie den Sitzungskonfigurationsparameter json_serialization_enable, um das Serialisierungsverhalten zu konfigurieren. Wenn diese Einstellung festgelegt ist, werden komplexe JSON-Datentypen in VARCHAR(65535) serialisiert. Auf den verschachtelten JSON-Datentyp kann mit JSON-Funktionen zugegriffen werden. Weitere Informationen finden Sie unter json_serialization_enable.

Beispiel: Ohne die Einstellung von json_serialization_enable schlagen die folgenden Abfragen, die auf verschachtelte Spalten direkt zugreifen, fehl.

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

Das Einstellen von json_serialization_enable ermöglicht das direkte Abfragen von Sammlungen der obersten Ebene.

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"}

Beachten Sie die folgenden Elemente, wenn Sie verschachtelte JSON-Datentypen serialisieren.

  • Wenn Sammlungsspalten als VARCHAR(65535) serialisiert werden, kann auf ihre verschachtelten Unterfelder nicht direkt als Teil der Abfragesyntax zugegriffen werden (z. B. in der Filter-Klausel). JSON-Funktionen können jedoch für den Zugriff auf verschachtelte JSON-Datentypen verwendet werden.

  • Die folgenden spezialisierten Darstellungen werden nicht unterstützt:

    • ORC-Vereinigungen

    • ORC-Zuordnungen mit komplexen Typenschlüsseln

    • Ion-Datagramme

    • Ion SEXP

  • Zeitstempel werden als serialisierte ISO-Zeichenfolgen zurückgegeben.

  • Primitive Zuordnungsschlüssel werden zu einer Zeichenfolge heraufgestuft (z. B. 1 zu "1").

  • Nullwerte der obersten Ebene werden als NULL serialisiert.

  • Wenn die Serialisierung die maximale VARCHAR-Größe von 65535 übersteigt, wird die Zelle auf NULL gesetzt.

Serialisieren komplexer Typen, die JSON-Zeichenfolgen enthalten

Standardmäßig werden Zeichenfolgenwerte, die in verschachtelten Sammlungen enthalten sind, als Escape-JSON-Zeichenfolgen serialisiert. Escaping kann unerwünscht sein, wenn die Zeichenfolgen gültige JSON-Ausdrücke sind. Stattdessen sollten Sie verschachtelte VARCHAR-serialisierte Unterelemente oder Felder direkt als JSON schreiben. Aktivieren Sie dieses Verhalten mit der Konfiguration json_serialization_parse_nested_strings auf Sitzungsebene. Wenn json_serialization_enable und json_serialization_parse_nested_strings eingestellt sind, werden gültige JSON-Werte inline ohne Escape-Zeichen serialisiert. Wenn der Wert kein gültiger JSON-Ausdruck ist, wird er escaped, als ob der json_serialization_parse_nested_strings-Konfigurationswert nicht festgelegt wäre. Weitere Informationen finden Sie unter json_serialization_parse_nested_strings.

Angenommen, die Daten aus dem vorherigen Beispiel enthielten JSON als komplexen structs-Typ in im VARCHAR(20)-Feld name:

name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}

Wenn json_serialization_parse_nested_strings eingestellt ist, wird die Spalte name wie folgt serialisiert:

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"}

Anstatt wie folgt escaped zu werden:

SET json_serialization_enable TO true; SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}