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 analysieren. Eine JSONPaths Datei ist eine Textdatei, die ein einzelnes JSON-Objekt enthält, dessen Name mit einer Reihe von JSONPath Ausdrücken "jsonpaths" gepaart ist. Handelt es sich bei dem Namen um eine andere Zeichenfolge als"jsonpaths", verwendet COPY das 'auto' Argument anstelle der JSONPaths Datei.

Beispiele, die zeigen, wie Daten mithilfe von'auto', oder einer JSONPaths Datei geladen werden'auto ignorecase', wobei entweder JSON-Objekte oder Arrays verwendet werden, finden Sie unterBeispiele für die COPY-Operation aus JSON.

JSONPath Option

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

Im Folgenden finden Sie ein Beispiel für eine JSONPaths Datei mit JSONPath Ausdrücken, die die Klammernotation 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).

Das folgende Beispiel zeigt die vorherige JSONPaths Datei in Punktnotation.

{ "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 Punktnotation dürfen die JSONPath Ausdrücke die folgenden 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, auf das ein JSONPath Ausdruck verweist, um ein Objekt oder ein Array handelt, wird das gesamte Objekt oder die Matrix als Zeichenfolge geladen, einschließlich der geschweiften Klammern oder 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" } ] }

Der JSONPath Ausdruck gibt $['tags'] dann den folgenden Wert zurück.

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

Der JSONPath Ausdruck gibt $['friends'][1] dann den folgenden Wert zurück.

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

Jeder JSONPath Ausdruck im jsonpaths Array entspricht einer Spalte in der Amazon Redshift 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 entweder mit dem 'auto' Argument oder einer JSONPaths Datei geladen werden und dabei entweder JSON-Objekte oder Arrays verwendet 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://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/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.