Ich kopiere mit dem Befehl:
kopiere t1a (c1, c3) von t1
Ich habe erwartet, dass c1 und c3 von t1 kopiert werden und der Standard-Null-Wert in c2 platziert wird, sodass eine Zeile in t1a aussehen könnte (c1_rowX, null, c3_rowX).
Stattdessen erhalte ich einen Typfehler, weil c2 (string type) von t1 in c3 (int type) von t1a umgewandelt wird.
Der Kopierbefehl funktioniert einwandfrei, wenn ich die Spalten nicht angeben:
kopiere t1a von t1
Ich habe einen Link zur Dokumentation des redshift copy-Befehls eingefügt:
Wenn Sie den Vorverarbeitungsteil überspringen möchten, können Sie die zu überspringende Spalte als CHAR(1)
definieren und dann einen TRUNCATECOLUMNS
-Parameter für einen COPY
-Befehl verwenden:
Das TRUNCATECOLUMNS
ignoriert alle Daten, die länger als in einem Tabellenschema definiert sind, während des Imports, so dass alle Daten in dieser Spalte in 1 Zeichen gekürzt werden.
Das ist nur ein Hack, eine Vorverarbeitungs-Eingabedatei wird empfohlen, aber manchmal ist nur ein Hack nötig.
Detaillierte Spaltenzuordnungen werden nicht direkt in COPY
unterstützt, es sei denn, Amazon / ParAccel fügt ihrer PostgreSQL-Verzweigung, die nicht in der Hauptlinie enthalten ist, etwas hinzu.
Was Sie in diesem Fall normalerweise tun, ist ein Skript, das die Daten massiert / packt - lesen Sie die CSV, transformieren Sie sie wie gewünscht, und senden Sie die Zeile durch die PostgreSQL-Verbindung an einen COPY ... FROM STDIN
-Befehl.
Alternativ können Sie COPY
die gesamte ursprüngliche CSV-Datei in eine Tabelle übernehmen und diese Daten dann mit INSERT INTO ... SELECT
in die reale Zieltabelle transformieren.
Tags und Links postgresql amazon-redshift