Wie kann ich eine Tabelle in RedShift sicher entladen / kopieren?

8

In RedShift ist es praktisch, mit Entladen / Kopieren Daten nach S3 zu verschieben und zurück in die Rotverschiebung zu laden, aber ich finde es schwierig, das Trennzeichen jedes Mal zu wählen. Das richtige Trennzeichen ist für den Inhalt der Tabelle relevant! Ich musste das Delimiter jedes Mal ändern, wenn ich Ladefehler traf.

Wenn ich beispielsweise den folgenden Befehl zum Entladen / Kopieren einer Tabelle verwende:

%Vor%

Ich bekomme einen Ladefehler, wenn die Tabelle zufällig ein Feld mit dem Inhalt "||" enthält. Dann muss ich das Trennzeichen '|' zu einem anderen wie ',' und versuche es erneut, wenn ich Pech habe, braucht es vielleicht mehrere Versuche, um einen Erfolg zu haben.

Ich frage mich, ob es eine Möglichkeit gibt, eine redshift-Tabelle zu entladen / kopieren, die für den Inhalt der Tabelle irrelevant ist, die immer keinen Erfolg hat, egal, welche merkwürdigen Strings in der Tabelle gespeichert sind.

    
ciphor 16.10.2014, 17:52
quelle

3 Antworten

24

Endlich habe ich den richtigen Ansatz gefunden, escape sowohl beim Entladen als auch beim Kopieren hinzuzufügen:

%Vor%

Mit escape im Befehl entladen wird für CHAR- und VARCHAR-Spalten in entpackten Dateien mit Trennzeichen vor jedem Auftreten der folgenden Zeichen ein Escape-Zeichen (\) eingefügt:

  • Zeilenvorschub: \ n
  • Beförderung zurück: \ r
  • Das Trennzeichen, das für die entladenen Daten angegeben wurde.
  • Das Escapezeichen: \
  • Ein Anführungszeichen: "oder" (wenn sowohl ESCAPE als auch ADDQUOTES angegeben sind im Befehl UNLOAD).

Und mit escape im copy -Befehl wird der umgekehrte Schrägstrich () in Eingabedaten als Escape-Zeichen behandelt. Das Zeichen, das dem Backslash-Zeichen unmittelbar folgt, wird als Teil des aktuellen Spaltenwerts in die Tabelle geladen, auch wenn es sich um ein Zeichen handelt, das normalerweise einem bestimmten Zweck dient. Sie können diese Option beispielsweise verwenden, um das Trennzeichen, ein Anführungszeichen, eine eingebettete neue Zeile oder das Escape-Zeichen selbst zu umgehen, wenn eines dieser Zeichen ein zulässiger Teil eines Spaltenwerts ist.

    
ciphor 17.10.2014, 16:42
quelle
1

Entladen Sie wie folgt

%Vor%

Um es zurück zu laden, verwenden Sie wie folgt

%Vor%

Dies funktioniert unabhängig von Ihren Daten dazwischen.

    
Sandesh Deshmane 17.10.2014 07:13
quelle
0

Da dieses Thema vielerorts auftaucht, haben wir uns entschieden, den Prozess UNLOAd / extract in einen Docker-Service zu packen. Der gesamte Code befindet sich auf Github, so dass Sie ihn unverändert verwenden oder den zugrunde liegenden Python-Code verwenden können, um Ihre eigene Version zu erstellen: Ссылка

Sie können Delimiter, Daten und Ad-hoc-SQL über die Laufzeitkonfiguration festlegen. Dies wird auch eine Kopfzeile exportieren, was etwas komplizierter ist.

Hier sind einige der Laufzeitoptionen:

%Vor%

Hinweis: -s und -d sind gegenseitig exklusiv und können nicht zusammen verwendet werden. Wenn keine verwendet wird, wird das Skript standardmäßig keine WHERE-Klausel angeben und die gesamte Tabelle ausgeben.

Dann kannst du es wie folgt auf UNLOAD laufen lassen:

%Vor%

Das Ziel bestand darin, den Standard-UNLOAD-Prozess zu verbessern und ihn in etwas zu verpacken, das dazu beitragen kann, die Konsistenz beim Generieren von Ausgaben sicherzustellen.

Hier ist eine Zusammenfassung, die die Features / Fähigkeiten beschreibt: Ссылка

    
Thomas Spicer 14.08.2017 13:07
quelle

Tags und Links