COPY von JSON-Format - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

COPY von JSON-Format

Die JSON-Datenstruktur besteht aus einem Satz von Objekten oder Arrays. Ein JSON-Objekt beginnt und endet mit geschweiften Klammern und enthält eine nicht geordnete Sammlung von Name-Wert-Paaren. Jeder Name und jeder Wert werden durch einen Doppelpunkt getrennt und die Paare werden durch Kommas getrennt. Der Name ist eine Zeichenfolge in doppelten Anführungszeichen. Bei den Anführungszeichen muss es sich um normale Anführungszeichen (0x22) handeln. Es dürfen keine schrägen oder „smarte“ doppelte Anführungszeichen sein.

Ein JSON-Array beginnt und endet mit eckigen Klammern und enthält eine geordnete Sammlung von Werten, getrennt durch Kommas. Ein Wert kann eine Zeichenfolge in doppelten Anführungszeichen, eine Zahl, ein boolescher Wert (wahr oder falsch), null, ein JSON-Objekt oder ein Array sein.

JSON-Objekte und -Arrays können verschachtelt sein, was eine hierarchische Datenstruktur ermöglicht. Im folgenden Beispiel wird eine JSON-Datenstruktur mit zwei gültigen Objekten gezeigt.

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

Im Folgenden werden dieselben Daten als zwei JSON-Arrays gezeigt.

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

COPY-Optionen für JSON

Sie können die folgenden Optionen angeben, wenn Sie COPY mit Daten im JSON-Format verwenden:

  • 'auto' – COPY lädt automatisch Felder aus der JSON-Datei.

  • 'auto ignorecase' – COPY lädt automatisch Felder aus der JSON-Datei, die Groß-/Kleinschreibung von Feldnamen wird ignoriert.

  • s3://jsonpaths_file – COPY verwendet eine JSONPaths-Datei, um die JSON-Quelldaten zu parsen. Eine JSONPaths-Datei ist eine Textdatei, die ein einzelnes JSON-Objekt mit dem Namen "jsonpaths" enthält, gepaart mit einem Array aus JSONPath-Ausdrücken. Wenn der Name eine andere Zeichenfolge als "jsonpaths" ist, verwendet COPY das Argument 'auto' und nicht die JSONPaths-Datei.

Beispiele, die zeigen, wie Daten unter Verwendung von 'auto', 'auto ignorecase' oder einer JSONPaths-Datei bzw. unter Verwendung von JSON-Objekten oder -Arrays geladen werden, finden Sie unter Beispiele für die COPY-Operation aus JSON.

JSONPath-Option

In der COPY-Syntax von Amazon Redshift gibt ein JSONPath-Ausdruck den expliziten Pfad zu einem einzelnen Namenselement in einer hierarchischen JSON-Datenstruktur an, wobei entweder die Klammer- oder die Punktnotation verwendet wird. Amazon Redshift unterstützt keine JSONPath-Elemente, wie z. B. Platzhalterzeichen oder Filterausdrücke, die zu einem mehrdeutigen Pfad oder mehreren Namenselementen führen könnten. Daher kann Amazon Redshift keine komplexen Datenstrukturen mit mehreren Ebenen analysieren.

Im folgenden Beispiel wird eine JSONPaths-Datei mit JSONPath-Ausdrücken gezeigt, die eine Klammernotierung verwenden. Das Dollarzeichen ($) stellt die Stammebenenstruktur dar.

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

Im vorherigen Beispiel referenziert $['location'][0] das erste Element in einem Array. JSON verwendet eine nullbasierte Array-Indizierung. Bei Array-Indizes muss es sich um positive Ganzzahlen handeln (größer als oder gleich null).

Im folgenden Beispiel wird die vorherige JSONPaths-Datei unter Verwendung einer Punktnotierung gezeigt.

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

Sie können Klammer- und Punktnotierung im jsonpaths-Array nicht mischen. Eckige Klammern können sowohl in der Klammer- als auch in der Punktnotierung verwendet werden, um ein Array-Element zu referenzieren.

Bei Verwendung der Punktnotierung dürfen die JSONPath-Ausdrücke folgende Zeichen nicht enthalten:

  • Einfache gerade Anführungszeichen (')

  • Punkt (.)

  • Eckige Klammern ([]), es sei denn, sie werden verwendet, um ein Array-Element zu referenzieren

Wenn es sich bei dem Wert in dem Name-Wert-Paar, das von einem JSONPath-Ausdruck referenziert wird, um ein Objekt oder ein Array handelt, wird das gesamte Objekt oder Array als eine Zeichenfolge geladen, einschließlich geschweifter oder eckiger Klammern. Angenommen, Ihre JSON-Daten enthalten das folgende Objekt.

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

Anschließend gibt der JSONPath-Ausdruck $['tags'] den folgenden Wert zurück.

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

Anschließend gibt der JSONPath-Ausdruck $['friends'][1] den folgenden Wert zurück.

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

Jeder JSONPath-Ausdruck im jsonpaths-Array entspricht einer einzelnen Spalte in der Amazon-Redshift-Zieltabelle. Die Reihenfolge der jsonpaths-Array-Elemente muss der Reihenfolge der Spalten in der Zieltabelle oder Spaltenliste entsprechen, wenn eine Spaltenliste verwendet wird.

Beispiele, die zeigen, wie Daten unter Verwendung des Arguments 'auto' oder einer JSONPaths-Datei bzw. unter Verwendung von JSON-Objekten oder Arrays geladen werden, finden Sie unter Beispiele für die COPY-Operation aus JSON.

Informationen zum Kopieren mehrerer JSON-Dateien finden Sie unter Verwenden eines Manifests für die Angabe von Datendateien.

Escape-Zeichen in JSON

COPY lädt \n als Zeichen für neue Zeilen und \t als Tabulatorzeichen. Um einen Backslash zu laden, muss ein Backslash als Escape-Zeichen verwendet werden ( \\ ).

Angenommen, es gibt die folgenden JSON-Daten in einer Datei namens escape.json im Bucket s3://mybucket/json/.

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

Führen Sie die folgenden Befehle aus, um die Tabelle ESCAPES zu erstellen und JSON zu laden.

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';

Führen Sie eine Abfrage für die Tabelle ESCAPES aus, um die Ergebnisse anzuzeigen.

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

Verlust der numerischen Präzision

Wenn Sie Zahlen aus Datendateien im JSON-Format in eine Spalte laden, die als numerischer Datentyp formatiert ist, geht möglicherweise die Präzision verloren. Einige Gleitpunktwerte werden in Rechnersystemen nicht genau dargestellt. Dies hat zur Folge, dass aus einer JSON-Datei kopierte Daten nicht wie von Ihnen erwartet gerundet werden. Um einen Verlust der Präzision zu vermeiden, raten wir zur Verwendung einer der folgenden Alternativen:

  • Stellen Sie die Zahl als eile Zeichenfolge dar, deren Wert in doppelte Anführungszeichen gesetzt wird.

  • Verwenden Sie ROUNDEC, um die Zahl zu runden, anstatt sie zu kürzen.

  • Verwenden Sie anstelle von JSON- oder Avro-Dateien CSV-, durch Zeichen begrenzte oder Textdateien fester Breite.