Kopieren von Daten von Amazon S3, um die Rotverschiebung und vermeiden Sie doppelte Zeilen
Ich bin kopieren von Daten von Amazon S3, um die Rotverschiebung. Während dieses Prozesses, ich brauche zu vermeiden, die gleichen Dateien wieder geladen. Ich habe keine eindeutige Einschränkungen auf meinem Rotverschiebung Tabelle. Gibt es eine Möglichkeit dies umzusetzen mit dem Befehl copy?
http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html
Ich habe versucht, das hinzufügen unique-Einschränkung und Einstellung-Spalte als primary key mit kein Glück. Die Rotverschiebung scheint das nicht zu unterstützen unique/primary key-Einschränkungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Lösung ist, führen Sie eine 'löschen' - Befehl vor 'copy' auf dem Tisch. In meinem Anwendungsfall, jedes mal muss ich zum kopieren der Datensätze einer täglichen snapshot, um die Rotverschiebung Tabelle, so kann ich auch mit dem folgenden "löschen" - Befehl, um sicherzustellen doppelte Datensätze gelöscht werden, dann führen Sie den "copy" - Befehl.
Als user1045047 erwähnt, Amazon Redshift unterstützen nicht, unique-Einschränkungen, also ich war auf der Suche nach der Möglichkeit zum löschen von doppelten Datensätzen aus einer Tabelle mit einem delete-Anweisung.
Schließlich fand ich heraus, ein vernünftiger Weg.
Amazon Redshift unterstützt das erstellen einer IDENTITY-Spalte gespeichert ist, eine automatisch generierte, eindeutige Nummer.
http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html
Den folgenden sql für PostgreSQL zu löschen doppelte Datensätze mit der OID ist eine eindeutige Spalte, und Sie können diese sql durch den Austausch OID mit der identity-Spalte.
Hier ist ein Beispiel, getestet habe ich auf mein Amazon Redshift-cluster.
Außerdem funktioniert es mit dem KOPIEREN-Befehl wie diesen.
auto_id_table.csv -
kopieren der sql
Der Vorteil dieser Möglichkeit ist, dass Sie nicht brauchen, um ausführen von DDL-Anweisungen. Aber es funktioniert nicht mit vorhandenen Tabellen, die nicht über eine identity-Spalte, da eine identity-Spalte kann nicht Hinzugefügt werden, um eine vorhandene Tabelle. Der einzige Weg, um löschen Sie doppelte Datensätze mit vorhandenen Tabellen ist die Migration sämtlicher Datensätze wie diese. (gleiche wie user1045047 Antwort)
copy sql
zeigt, dass es behandelt Duplikate richtig. Für die Daten, die Sie laden,audo_id_table.csv
, es hat einfach 3 eindeutige Zeilen, Nein?copy auto_id_table
drei mal bekommen und drei doppelte Datensätze, werden diese duplizierten Datensätze gelöscht werden, die mit den oben genanntendelete from auto_id_table....
Abfrage.If you use multiple concurrent COPY commands to load one table from multiple files, Amazon Redshift is forced to perform a serialized load, which is much slower and requires a VACUUM at the end if the table has a sort column defined
Mmm..
Was einfach nie das laden von Daten in das master-Tabelle direkt.
Schritte, um Doppelarbeit zu vermeiden:
dies ist auch
superetwas schnell, und empfohlen von Rotverschiebung docs.group by
des zusammengesetzten Schlüssels und tun alle notwendigen Aggregate oderfirst_value
um Duplikate zu vermeiden, wenn Sie.Derzeit gibt es keine Möglichkeit, Duplikate entfernen von Rotverschiebung. Rotverschiebung nicht unterstützt, primary key/unique key constraints, und auch das entfernen von Duplikaten mit Hilfe von Zeilennummern ist nicht eine option (löschen von Zeilen mit Zeilen-Zahl größer als 1) als die delete-operation auf die Rotverschiebung nicht erlaubt komplexe Aussagen (Auch das Konzept der Zeilennummer nicht vorhanden in Rotverschiebung).
Der beste Weg, um Duplikate entfernen ist das erstellen eines cron/Quarz-job, würden Sie alle eindeutigen Zeilen, steckte Sie in einer separaten Tabelle und benennen Sie die Tabelle mit Ihrer ursprünglichen Tabelle.
Insert into temp_originalTable (Select Distinct from originalTable)
Drop table originalTable
Alter table temp_originalTable rename to originalTable