1

Ich habe zwei DynamoDB-Tabellen: Table_1 und Table_2. Ich versuche, Tabelle_1 abzulehnen und Informationen aus Tabelle_1 in Tabelle 2 zu kopieren, die unterschiedliche GSIs und verschiedene LSIs aufweist.Kopieren der DynamoDB-Tabelle in eine andere DynamoDB-Tabelle mit Transformationen

Table_1 Attribute sind: Id, Zustand, isReused, leer, normal

table_2 Attribute sind: Benutzer-ID, Status, iSold, normal

Id Karten zu UserId, Zustand Karten Status, Normal Maps zu normalen , leer wird aus Tabelle_2 gelöscht, und wenn der Status "OLD" ist, wird isOld auf wahr gesetzt.

Was ist der beste Weg, diese Daten aus Table_1 zu exportieren, die Transformation für die Attribute/Daten durchzuführen und dann die Informationen wieder in Table_2 zu laden?

Momentan kann ich AWS Data Pipeline zum Importieren/Exportieren von Daten aus Table_1 in Table_2 mit den angegebenen Vorlagen verwenden, die Transformationen werden jedoch nicht ausgeführt. Ich vermute, dass ich EMR verwenden muss, um die Transformationen zu machen.

Ich verwende auch DynamoDB-Streams, um die Tabelle synchron zu halten, aber aus meiner Sicht streamt DynamoDB Streams nur aktualisierte Informationen, nicht Informationen, die bereits in einer Tabelle vorhanden sind.

+0

Datapipeline nicht die Lösung ist, erforschen dynamo DB Ströme – Shibashis

+0

@Shibashis nur Ströme gibt Updates/Modifikationen an der ursprünglichen Tabelle, nicht auf die bereits vorhandenen Daten. Ich verwende derzeit DynamoDB-Streams, um neue Updates synchron zu halten. – nat

+0

Möglicherweise müssen Sie hierfür einen benutzerdefinierten EMR-Job erstellen. Die Datenpipeline ist ein EMR-Job ohne die Anpassung. – Shibashis

Antwort

2

Unter der Annahme, dass Sie nur einmal diese Daten Bewegung benötigen, kann ich mir vorstellen zwei Möglichkeiten:

  • Spawn ein EMR-Cluster mit Hive installiert. Erstellen Sie zwei Hive-Tabellen, jeweils eine in Tabelle_1 und Tabelle_2. Dann tun Sie etwas wie 'in Tabelle_2 einfügen wählen Sie ... aus Tabelle_1'. Dies gibt Ihnen vollständige Kontrolle über die Transformationen, die Sie benötigen.
  • Es stimmt, dass nur aktualisierte und neue Elemente an einen DynamoDB-Stream gesendet werden. Wenn Sie bereits über ein Syncer-Setup verfügen, aktualisieren Sie alle vorhandenen Elemente in Tabelle_1 einmal. Füge einfach ein Dummy-Feld zu allen hinzu, sodass sie in den Stream von Table_1 verschoben werden. Danach werden sie automatisch in Table_2 kopiert! Stellen Sie nur sicher, dass Ihr Syncer dieses Dummy-Feld ignoriert. Vorteile dieses Ansatzes:
    • Wird Race-Bedingungen gut behandeln.
    • Anhand Ihrer Geschäftslogik können Sie schnell überprüfen, ob ein Element in Tabelle_1 bereits mit Table_2 synchronisiert wurde. Dies gibt Ihnen die Freiheit, nur die Elemente in Tabelle_1 zu kopieren, die noch nicht in Tabelle 2 aktualisiert wurden.
+0

Beide Optionen sind sinnvoll, aber Option 1 scheint sicherer zu sein, da Table_1 immer noch eine Live-Tabelle ist und eine autorisierende Datenquelle darstellt.Wenn bei Option 1 an den einzelnen Elementen in Tabelle_1 noch Aktualisierungen vorgenommen werden, während der EMR-Job/die EMF-Umsetzungen ausgeführt werden, empfehlen Sie, die Verarbeitung von DynamoDB-Datenströmen während der Auffüllung abzubrechen? Wenn der Abgleich abgeschlossen ist, verarbeiten Sie die DynamoDB-Stream-Aktualisierungen erneut. Andernfalls werden Aktualisierungen für Elemente in Tabelle_1 während des Abgleichs möglicherweise nicht in Tabelle 2 wiedergegeben. – nat

+0

"Würden Sie empfehlen, mit der Verarbeitung von DynamoDB-Streams aufzuhören, während das Backfill stattfindet?": Ich denke nicht, dass das unter Rennbedingungen helfen würde. beispielsweise gibt es 1000 Elemente (i1, i2, ... i1000). EMR verarbeitet i1 bis i500. Jetzt kommen zwei Updates für i5 und i600. Da EMR i600 noch nicht verarbeitet hat, wird der aktualisierte Wert dieses Elements in Tabelle 2 kopiert. aber Ihr Stream wird beide haben –

+0

"Tabelle_1 ist immer noch eine Live-Tabelle und ist eine autoritative Datenquelle": das ist genau der Grund, denke ich, Option # 2 wäre besser. Ich aktualisiere meine Antwort mit ihren Vorteilen. –

0

Statt Datenpipeline verwenden und EMR Jobs schreiben, können Sie ein Skript schreiben, alle Elemente in Table_1 abzufragen und eine in Java umwandeln zu tun. Nachdem Sie die Transformation in Java ausgeführt haben, führen Sie einen bedingten put [1] aus, um das Element in Tabelle 2 nur zu aktualisieren, wenn es nicht existiert. Dadurch wird sichergestellt, dass alle Änderungen, die während dieses Abgleichs in Tabelle_1 vorgenommen werden, die neuesten Informationen in Tabelle 2 anzeigen.

(http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)

Verwandte Themen