2013-06-11 13 views
8
  • Ich habe eine CSV-Tabelle (t1) mit Spalten überspringen: c1, c2, c3 in Amazon S3 Speicher
  • Ich möchte kopieren, die in amazon Rotverschiebung
  • I erstellen Sie die Tabelle mit Spalten: c1, c2, c3, in der alle Spalten auf NULL festlegbare
  • ich mit dem Befehl kopieren:in Rotverschiebung postgresql kann ich Spalten mit der Kopierfunktion

    Kopie t1a (c1, c3) von t1

  • Ich dachte, es würde c1 und c3 von t1 kopieren und den Standard-Null-Wert in c2 platzieren, so dass eine Zeile in t1a aussehen könnte (c1_rowX, null, c3_rowX).

  • Stattdessen erhalte ich einen Typfehler, weil es c2 (string type) Daten von t1 in c3 (int Typ) von t1a.

  • der Kopierbefehl funktioniert gut, wenn ich nicht angeben, die Spalten:

    Kopie t1a von t1

  • ich einen Link zu der Rotverschiebung Kopierbefehl Dokumentation haben:

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

  • m Eine Frage ist, gibt es ein Problem mit meiner Verwendung von Spalten angeben. Dank

Antwort

4

Detaillierte Spalte-Zuordnungen werden nicht direkt in COPY unterstützt, es sei denn Amazon/ParAccel etwas extra zu ihrer PostgreSQL Gabel hinzugefügt haben, die nicht in Hauptstrecke ist.

Was Sie in diesem Fall tun, ist ein Skript massage/pad die Daten - lesen Sie die CSV, transformieren Sie es wie gewünscht, dann senden Sie die Linie durch die PostgreSQL-Verbindung zu einem COPY ... FROM STDIN Befehl.

Alternativ könnten Sie die gesamte ursprüngliche CSV in eine Tabelle COPY in eine Tabelle dann transformieren Sie diese Daten mit einer INSERT INTO ... SELECT in die reale Zieltabelle.

+0

danke, Craig. In der Hoffnung, das Kopieren der gesamten Datei aufgrund von Größen- und Zeitproblemen zu vermeiden. Kann vor dem Kopieren transformieren. – Elm

+0

amazon bietet Kopiervorlage: COPY tabellenname [(Spalte1 [, Spalte2, ...])] - wobei (Spalte1 [, Spalte2, ...)) "eine optionale Spaltenliste zum Laden von Datenfeldern in bestimmte Spalten angibt" – Elm

+0

@Elm Klar, aber das lässt dich nicht sagen 'COPY tablename (col1, SKIP, col3)' tut es ... und das ist es, was du willst?Selbst wenn Pg unterstützt, dass es immer noch alle Daten übertragen muss, um die Teile, die Sie nicht wollten, zu verwerfen, ist es viel sinnvoller, diese Client-Seite mit einem Vorverarbeitungs-Skript zu machen. –

10

Wenn Sie Vorverarbeitung Teil überspringen möchten, können Sie die Spalte definieren als CHAR(1) zu überspringen und dann einen TRUNCATECOLUMNS Parameter auf einen COPY Befehl verwenden:

CREATE TABLE t1a (
    c1, 
    c2 CHAR(1), 
    c3 
); 
COPY t1a FROM t1 TRUNCATECOLUMNS 

Die TRUNCATECOLUMNS ignoriert alle Daten, die länger als definiert In einem Tabellenschema während des Imports werden alle Daten in dieser Spalte in 1 Zeichen gekürzt.

Das ist nur ein Hack, Preprocessing-Eingabedatei wird empfohlen, aber manchmal ist nur ein Hack benötigt.