Ich kopiere Daten von Amazon S3 nach Redshift. Während dieses Prozesses muss ich vermeiden, dass dieselben Dateien erneut geladen werden. Ich habe keine eindeutigen Einschränkungen für meine Redshift-Tabelle. Gibt es eine Möglichkeit, dies mit dem Kopierbefehl zu implementieren?
Ich habe versucht, eine eindeutige Integritäts- und Einstellungsspalte ohne Erfolg als Primärschlüssel hinzuzufügen. Redshift scheint keine eindeutigen / primären Schlüsseleinschränkungen zu unterstützen.
Meine Lösung ist, einen 'Löschen' Befehl auszuführen, bevor 'Kopieren' in der Tabelle. In meinem Anwendungsfall muss ich jedes Mal, wenn ich die Datensätze eines täglichen Snapshots in die Redshift-Tabelle kopieren muss, den folgenden "delete" -Befehl verwenden, um sicherzustellen, dass doppelte Datensätze gelöscht werden, und dann den Befehl "copy" ausführen.
DELETE von t_data wo snapshot_day = 'xxxx-xx-xx';
Wie bereits erwähnt, unterstützt Amazon Redshift keine eindeutigen Einschränkungen. Daher suchte ich nach Möglichkeiten, doppelte Datensätze aus einer Tabelle mit einer delete-Anweisung zu löschen. Schließlich habe ich einen vernünftigen Weg gefunden.
Amazon Redshift unterstützt das Erstellen einer IDENTITY-Spalte, in der eine automatisch generierte eindeutige Nummer gespeichert wird. Ссылка
Das folgende sql ist für PostgreSQL, doppelte Datensätze mit OID zu löschen, die eindeutige Spalte ist, und Sie können diese SQL verwenden, indem Sie OID durch die Identitätsspalte ersetzen.
%Vor%Hier ist ein Beispiel, das ich in meinem Amazon Redshift Cluster getestet habe.
%Vor%Es funktioniert auch mit COPY-Befehl wie folgt.
auto_id_table.csv
%Vor%Kopie sql
%Vor%Der Vorteil dieser Methode besteht darin, dass Sie keine DDL-Anweisungen ausführen müssen. Es funktioniert jedoch nicht mit vorhandenen Tabellen, die keine Identitätsspalte haben, da eine Identitätsspalte keiner vorhandenen Tabelle hinzugefügt werden kann. Die einzige Möglichkeit, doppelte Datensätze mit vorhandenen Tabellen zu löschen, besteht darin, alle Datensätze wie diese zu migrieren. (wie die Antwort von user1045047)
%Vor%Gegenwärtig gibt es keine Möglichkeit, Duplikate aus der Rotverschiebung zu entfernen. Redshift unterstützt keine Primärschlüssel / Unique - Key - Constraints, und das Entfernen von Duplikaten mit Zeilennummer ist keine Option (Löschen von Zeilen mit Zeilennummer größer als 1), da die Löschoperation bei Rotverschiebung keine komplexen Anweisungen erlaubt Zeilennummer ist nicht in Rotverschiebung vorhanden).
Der beste Weg, Duplikate zu entfernen, besteht darin, einen Cron / Quarz-Job zu schreiben, der alle verschiedenen Zeilen auswählt, sie in eine separate Tabelle einfügt und die Tabelle dann in Ihre ursprüngliche Tabelle umbenennt.
Insert into temp_originalTable (Select Distinct from originalTable)
Drop table originalTable
Alter table temp_originalTable rename to originalTable
Mmm ..
Wie wäre es, Daten niemals direkt in Ihre Haupttabelle zu laden?
Schritte zur Vermeidung von Doppelungen:
Das ist auch super etwas schnell und wird von redshift docs empfohlen.
Tags und Links amazon amazon-s3 amazon-redshift copy duplicates