2013-07-15 10 views
10

Gibt es eine Möglichkeit, mehrere Hash-Schlüssel mit einer einzigen Abfrage in Amazon AWS SDK für Java abzufragen?Gibt es eine Möglichkeit, mehrere Hash-Schlüssel in DynamoDB abzufragen?

Hier ist mein Problem; Ich habe eine DB-Tabelle für Projektstatus. Der Hash-Schlüssel ist der Status eines Projekts (dh neu, zugewiesen, verarbeitet oder abgeschlossen). Der Bereichsschlüssel ist eine Gruppe von Projekt-IDs. Momentan habe ich eine Abfrage-Einrichtung, um einfach alle Projekte zu finden, die als Status (Hash) von "zugewiesen" aufgelistet sind, und eine andere Abfrage, die auf den Status "Verarbeitung" eingestellt ist. Gibt es eine Möglichkeit, dies mit einer einzigen Abfrage zu tun, anstatt mehrere Abfragen für jeden Status zu senden, den ich finden muss? Code unten:

DynamoDBMapper mapper = new DynamoDBMapper(new AmazonDynamoDBClient(credentials)); 
    PStatus assignedStatus = new PStatus(); 
    assignedStatus.setStatus("assigned"); 
    PStatus processStatus = new PStatus(); 
    processStatus.setStatus("processing"); 

    DynamoDBQueryExpression<PStatus> queryAssigned = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(assignedStatus); 
    DynamoDBQueryExpression<PStatus> queryProcessing = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(processStatus); 

    List<PStatus> assigned = mapper.query(PStatus.class, queryAssigned); 
    List<PStatus> process = mapper.query(PStatus.class, queryProcessing); 

Also im Grunde, würde ich gerne wissen, ob es möglich ist, die queryAssigned und assigned Variablen zu beseitigen und sowohl assignedStatus und processStatus über die gleiche Abfrage zu behandeln, process, Projekte zu finden, die nicht neu sind oder Komplett.

+0

http://aws.typepad.com/aws/2013/ 04/local-secondary-indexes-for-amazon-dynamodb.html – Guy

+0

Entschuldigung, das ist nicht einmal annähernd das, wonach ich gefragt habe, und ich kenne bereits Sekundärindizes. – DGolberg

+0

Ich denke, dass Ihr Problem darauf hindeutet, dass Ihr Schema anders sein muss. Wenn Sie wiederholt 2 Hash-Schlüssel abfragen müssen, dann sollte das vielleicht ein spezieller Hash-Schlüssel sein (Duplizieren der Daten aus beiden Zuständen). – alexandroid

Antwort

7

Nein, ab heute gibt es keine Möglichkeit, mehrere Abfragen in derselben Anfrage zu senden. Wenn Sie Bedenken hinsichtlich der Latenz haben, können Sie mehrere Anfragen gleichzeitig in verschiedenen Threads durchführen. Dies würde die gleiche Menge an Netzwerk-Bandbreite erfordern wie eine "Dual-Abfrage", wenn Dynamo es anbieten würde (vorausgesetzt, Sie machen 2, nicht Hunderte).

+0

Es war eher ein Gedanke, die Zeichenfolgen einmal zu senden und den Server das aktuelle Element vergleichen zu lassen, bevor es zum nächsten zu überprüfenden Element ging.Es wäre effizienter zu hinterfragen, ob es das könnte, was ich mir vorstellen würde, aber ich denke, ich werde warten müssen, um zu sehen, ob sie sich dazu entschließen, das irgendwann zu tun. * hoffnungsvoll, aber nicht viel erwartet * Danke für die Antwort mindestens ... Ich werde für jetzt die Doppel-/Dreifach-Abfragen machen müssen. – DGolberg

+0

@DGolberg Tatsächlich speichert Dynamodb meines Wissens die Bereichsschlüsselindizes für jeden Hash-Schlüssel völlig getrennt voneinander, möglicherweise sogar auf verschiedenen Partitionen/Hosts. Durch die Implementierung einer Mehrfachabfrage müsste der Dynamo also Overhead hinzufügen wie "Was passiert, wenn 1 fehlschlägt und 1 nicht?" "Was ist, wenn man gedrosselt wird?", "Was ist, wenn man schneller ist? (Welcher Host wartet und schließt die Daten mit ein?"), Usw. Das ist meine Vermutung, warum sie es nicht implementiert haben. Allerdings sind die "Simplicity" -Wins für den Kunden ziemlich groß, also würde es mich nicht wundern, wenn sie es eines Tages hinzufügen würden. –

+0

Interessant. Ich kenne mich mit den internen Funktionen von DynamoDB noch nicht aus, also danke für die Informationen dazu. Ich muss sicher sein, das zu aktualisieren, wenn sie so etwas implementieren, da es sicherlich helfen würde, Dinge zu beschleunigen, wenn mehrere Abfragen notwendig sind. – DGolberg

-2

Sie können sich BatchGetItem Operation oder die batchLoad() Methode der DynamoDBMapper. Obwohl es etwas anders als eine Abfrage ist, da es keine Abfrage mit einer OR Bedingung auf dem Hash-Schlüssel ist, wird es Ihnen ermöglichen, (allgemein) die gleiche Sache zu erreichen. Hier ist die language agnostic documentation und hier ist die Javadoc.

+0

Funktioniert nicht. Sie müssen einen Bereichsschlüssel für die Operation 'batchLoad()' angeben, wenn eine Tabelle eine enthält oder Sie eine 'DynamoDBMappingException' erhalten. Dies verhindert, dass Sie einfach alle Elemente abfangen, deren Hash-Schlüssel identisch sind. Beispielsweise; sagen Sie, Sie haben eine Liste von Servern. Diese Liste zeigt Ihnen, welche Server online/offline/suspended/etc sind. über den Hash-Schlüssel und den Servernamen über den Bereichsschlüssel. Der einzige Weg, den ich kenne, um alle Server zu erhalten, die online aufgeführt sind, sowie diejenigen, die als offline aufgelistet sind (ohne ihre individuellen Namen zu kennen), besteht darin, einen Scan oder 2 Abfragen durchzuführen. – DGolberg

-2

Amazon API unterstützt nicht mehrere Hashkey Filter, aber Sie können HASH KEY + RANGE KEY Filter zu erhalten, die Ergebnisse mit batchGetItem Methode ..

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/batch-operation-lowlevel-java.html#LowLevelJavaBatchGet

+0

Dies ist, was das letzte Poster vorgeschlagen hat und es funktioniert nicht für diese Situation. Der ganze Zweck der Abfrage besteht darin, die IDs zu finden, die einem bestimmten Status entsprechen (die übrigens auch der Bereichsschlüssel sind). Die Anforderung 'batchGetItem' erfordert, dass Sie sowohl den Hash- als auch den Bereichsschlüssel kennen. Der einzige Grund, warum ich sogar einen Bereichsschlüssel habe, ist, dass ich mehrere Hash-Schlüssel mit demselben Wert haben kann, die abgefragt werden können. – DGolberg

3

Es gibt keine Möglichkeit zur Abfrage von mehreren Hash verwenden Schlüssel, aber seit April 2014 können Sie QueryFilter verwenden, so dass Sie zusätzlich zu Hash-Schlüsselfeldern nach Nicht-Schlüsselfeldern filtern können.

In einer Blog-Post am 24. April 2014 bekannt gegeben AWS die Freigabe der „Queryfilter“ Option:

Mit dem Release von heute, werden wir dieses Modell mit Unterstützung für Abfrage Filterung auf Nicht-Schlüsselattribut erstreckt. Sie können nun einen QueryFilter als Teil eines Aufrufs der Query-Funktion einschließen. Der Filter wird nach dem schlüsselbasierten Abruf angewendet, bevor die Ergebnisse an Sie zurückgegeben werden. Filtern kann auf diese Weise die Datenmenge reduzieren, um Ihre Anwendung zurückgeführt, während auch die Vereinfachung und Rationalisierung der Code

Check this out dort http://aws.amazon.com/blogs/aws/improved-queries-and-updates-for-dynamodb/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+AmazonWebServicesBlog+%28Amazon+Web+Services+Blog%29

+0

@AybatDuyshokov Ist die Leistung von 'QueryFilter'-Filter genauso wie bei Scan? –

+1

Tuukka Mustonen 1. Wählen Sie mit den Rautetasten aus 2. Filtern Sie die Ergebnismenge mit dem Abfragefilter (yep, die Ausführung dieses Schritts ist mit dem Scan identisch) 3. Geben Sie das Ergebnisresultat zurück. – Aybat

Verwandte Themen