2016-05-09 13 views
0

Wir haben ein Data-Warehouse-System, in dem wir Daten auf s3 im CSV-Format zu redshift Tabellen laden müssen. Die einzige Einschränkung besteht darin, dass nur eindeutige Datensätze in die Rotverschiebung eingefügt werden.ist "INSERT INTO SELECT" frei von Race-Bedingungen in Rotverschiebung

Um dies zu implementieren, verwenden wir Staging-Tabelle in folgender Weise.

ERSTELLEN EINER VORÜBERGEHENDEN TABELLE.

KOPIEREN SIE DIE S3-DATEI IN DIE TEMOPRAR-TABELLE.

TRANSACTION

INSERT INTO {main Rotverschiebung table} wählen Sie aus BEGIN {Verbindung zwischen Staging-Tabelle und Haupt Rotverschiebung Tabelle auf eine Säule, die eindeutig sein sollte für einen Datensatz eindeutig sein}

END TRANSACTION

Der Join, der in der Select-Unterabfrage verwendet wird, gibt die Datensätze zurück, die in der Staging-Tabelle, jedoch nicht in der Haupt-Redshift-Tabelle vorhanden sind.

Ist der obige Mechanismus frei von Rennbedingungen.

Zum Beispiel betrachten -

Haupt Rotverschiebung Tabelle hat keine Zeilen und eine s3-Datei enthält zwei Datensätze.

Also, wenn die gleiche s3-Datei von zwei verschiedenen Prozess/Anfragen geladen wird. Die Select-Abfrage für jede Anforderung liest die Haupt-Redshift-Tabelle als leer und der Join gibt beide Zeilen zurück, die in der Staging-Tabelle vorhanden sind, und die zwei Zeilen werden zweimal eingefügt, was zu doppelten Zeilen führt.

Antwort

0

Verschieben Sie die verarbeitete Datei in der Position "difference s3".

dh - 1 Angenommen, Sie App-Datei im Ziel s1

2 Datei verschieben Form s1 Staging s2 treibt

3 Datei verschieben Form (von diesem Ort, den Sie Rotverschiebung temporäre Tabelle zu füllen haben) s2 bis s3. Jetzt

4) tun TRANSACTION

INSERT INTO {main Rotverschiebung table} BEGIN wählen Sie aus {Verbindung zwischen Staging-Tabelle und Haupt Rotverschiebung Tabelle auf eine Säule, die eindeutig sein sollte für einen Datensatz eindeutig sein}

END TRANSACTION

0

Klingt wie ein potenzielles phantom read Szenario. Sie können dies vermeiden, indem Sie die höchste Transaktionsisolationsstufe SERIALIZABLE festlegen.

Aber das kann möglicherweise ziemlich teuer sein und zu Deadlocks führen. Vielleicht möchten Sie Ihre Lade-Pipeline also so ändern, dass Ladeaufgaben nacheinander ausgeführt werden, anstatt mehrere Ladeaufgaben parallel auf einer Tabelle auszuführen.