Einfaches Beispiel zum Abrufen von 500 Elementen aus Dynamodb mit Python

8

Sie suchen nach einem einfachen Beispiel für das Abrufen von 500 Elementen aus Dynamodb, um die Anzahl der Abfragen zu minimieren. Ich weiß, es gibt eine "Multiget" -Funktion, die mich in Stücke von 50 Abfragen aufteilen würde, aber nicht sicher, wie das geht.

Ich fange mit einer Liste von 500 Schlüsseln an. Ich denke dann darüber nach, eine Funktion zu schreiben, die diese Liste von Schlüsseln nimmt, sie in "Stücke" zerlegt, die Werte abruft, sie wieder zusammenfügt und ein Diktat mit 500 Schlüssel / Wert-Paaren zurückgibt.

Oder gibt es einen besseren Weg, dies zu tun?

Als eine logische Folge, wie würde ich die Artikel danach "sortieren"?

    
ensnare 25.08.2012, 12:32
quelle

1 Antwort

11

Je nach Ihrem Schema gibt es zwei Möglichkeiten, Ihre 500 Artikel effizient abzurufen.

1 Artikel sind unter dem gleichen hash_key , mit einem range_key

  • Verwenden Sie die Methode query mit hash_key
  • Sie können nach dem range_keys A-Z oder Z-A
  • fragen

2 Elemente sind auf "zufälligen" Tasten

  • Sie haben es gesagt: Verwenden Sie die Methode BatchGetItem
  • Gute Neuigkeiten: Das Limit ist eigentlich 100 / Anfrage oder 1MB max
  • Sie müssen die Ergebnisse auf der Python-Seite sortieren.

Auf der praktischen Seite, da Sie Python verwenden, empfehle ich die Boto-Bibliothek für Level-Zugriff oder dynamodb-mapper-Bibliothek für den Zugriff auf höhere Ebenen (Disclaimer: Ich bin einer der Kernentwickler von dynamodb- Mapper).

Leider bietet keine dieser Bibliotheken eine einfache Möglichkeit, die Operation batch_get zu umbrechen. Im Gegenteil, es gibt einen Generator für scan und für query , der "vorgibt", erhalten Sie alle in einer einzigen Abfrage.

Um optimale Ergebnisse mit der Batch-Abfrage zu erhalten, empfehle ich diesen Workflow:

  • Übermitteln Sie einen Stapel mit allen Ihren 500 Artikeln.
  • Speichern Sie die Ergebnisse in Ihren dicts
  • wiederhole es mit dem UnprocessedKeys so oft wie nötig
  • Sortiere die Ergebnisse auf der Python-Seite

Schnelles Beispiel

Ich nehme an, Sie haben eine Tabelle "MyTable" mit einem einzelnen hash_key

erstellt %Vor%

BEARBEITEN:

Ich habe eine resubmit() -Funktion zu BatchList im Boto-Entwicklungszweig hinzugefügt. Es vereinfacht den Arbeitsablauf erheblich:

  1. füge alle deiner angeforderten Schlüssel zu BatchList hinzu
  2. submit()
  3. resubmit() , solange es keine None zurückgibt.

Dies sollte in der nächsten Version verfügbar sein.

    
yadutaf 27.08.2012, 14:52
quelle

Tags und Links