2012-09-19 6 views
17

Ich möchte wissen, wie viele Artikel in meiner Dynamob Tabelle sind. Von den API-Leitfaden, eine Möglichkeit, es wird mit einem scan zu tun, wie folgt:Wie kann ich die Gesamtzahl der Elemente in einer DynamoDB-Tabelle ermitteln?

<?php 
$dynamodb = new AmazonDynamoDB(); 

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
)); 

echo "Total number of items: ".count($scan_response->body->Items)."\n"; 

Dies ist jedoch alle Einzelteile zu holen hat und speichern sie in einem Array im Speicher, die in den meisten Fällen nicht möglich ist, würde ich vermuten. Gibt es eine Möglichkeit, die Gesamtzahl der Elemente effizienter zu erhalten?

Diese Daten sind nicht in der AWS Dynamo Webkonsole verfügbar, habe ich bereits überprüft. (Zuerst sieht es so aus, als ob es neben den Seitentasten angezeigt wird, aber es stellt sich heraus, dass die Zahl wächst, wenn Sie auf die nächste Seite der Elemente gehen).

+0

Verwenden Sie DescribeTable, Details hier: http://Stackoverflow.com/a/37036989/3305145 – makinbacon

Antwort

19

Ich kann mir drei Optionen vorstellen, um die Gesamtzahl der Elemente in einer DynamoDB-Tabelle zu ermitteln.

  1. Die erste Option wird mit Hilfe der Scan, aber die Scan-Funktion ist ineffizient und ist in der Regel eine schlechte Praxis, vor allem für Tabellen mit schweren liest oder Produktions Tabellen.

  2. Die zweite Option ist das, was von Atharva Erwähnung war:

    A better solution that comes to my mind is to maintain the total number of item counts for such tables in a separate table, where each item will have Table name as it's hash key and total number of items in that table as it's non-key attribute. You can then keep this Table possibly named "TotalNumberOfItemsPerTable" updated by making atomic update operations to increment/decrement the total item count for a particular table.

    Das einzige Problem ist, dass diese Erhöhung Operationen idempotent nicht. Wenn also ein Schreibvorgang fehlschlägt oder Sie mehr als einmal schreiben, wird dies in der Zählung berücksichtigt. Wenn Sie eine genaue Genauigkeit benötigen, verwenden Sie stattdessen ein bedingtes Update.

  3. Die einfachste Lösung ist die DescribeTable, die ItemCount zurückgibt. Das einzige Problem ist, dass die Zählung nicht aktuell ist. Die Zählung wird alle 6 Stunden aktualisiert.

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html

5

Aha, gibt es eine Count Option in den scan API findet http://docs.amazonwebservices.com/AWSSDKforPHP/latest/#m=AmazonDynamoDB/scan

<?php 
$dynamodb = new DynamoMetadata(); 

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
    'Count'  => true, 
)); 

echo "Count: ".$scan_response->body->Count."\n"; 
+1

Wie Jeremy Lindblom in seiner Antwort erwähnt und dadurch belegt: http://docs.aws.amazon.com/amazondynamodb/ neustes/developerguide/QueryAndScan.html stellen Sie sicher, dass Sie sich um das 1MB-Limit kümmern, dh die Anzahl der zurückgegebenen Dateien kann teilweise zählen, wenn Ihre Tabellengröße größer als 1MB ist. – Atharva

+0

Immer, wenn ich den obigen Code ausführen, bekomme ich den folgenden: 'Fatal error: Class 'DynamoMetadata' nicht im Verzeichnis C: \ Benutzer \ Lenovo \ xampp \ public_html \ upload_file.php on line 73'. Was zu tun, um es zu lösen? –

10

Die Count Option ist auf jeden Fall, was Sie wollen, aber Sie haben auch zu berücksichtigen, dass es möglicherweise eine oder mehr " Seite "der Ergebnisse in Ihrem Scan-Ergebnis. Der Scan-Vorgang scannt nur 1 MB Daten in Ihrer Tabelle gleichzeitig, so dass der Wert Count im Ergebnis nur die Anzahl der ersten 1 MB der Tabelle widerspiegelt. Sie müssen nachfolgende Anfragen machen, indem Sie den Wert LastEvaluatedKey im Ergebnis verwenden (wenn es dort ist). Hier ist ein Beispielcode für so etwas zu tun:

<?php 

$dynamo_db = new AmazonDynamoDB(); 

$total = 0; 
$start_key = null; 
$params = array(
    'TableName' => 'my-table', 
    'Count'  => true 
); 

do { 
    if ($start_key) { 
     $params['ExclusiveStartKey'] = $start_key->getArrayCopy(); 
    } 

    $response = $dynamo_db->scan($params); 

    if ($response->isOK()) { 
     $total += (string) $response->body->Count; 

     if ($response->body->LastEvaluatedKey) { 
      $start_key = $response->body->LastEvaluatedKey->to_array(); 
     } else { 
      $start_key = null; 
     } 
    } 
} while ($start_key); 

echo "Count: {$total}"; 
+1

+1 für die Erwähnung der Grenze –

2

Ein ungefähren Artikel Zählwert (angeblich alle sechs Stunden aktualisiert) in der AWS-Konsole für DynamoDB zur Verfügung. Wählen Sie einfach die Tabelle aus und schauen Sie unter der Registerkarte Details nach, der letzte Eintrag ist Artikelanzahl. Wenn dies für Sie funktioniert, können Sie vermeiden, den Tabellendurchsatz zu verbrauchen, um die Anzahl zu berechnen.

3

Wenn Sie die Gesamtzahl der Elemente in einer Tabelle in der Logik Ihrer Anwendung verwenden möchten, bedeutet dies, dass Sie ziemlich häufig nach den Gesamtzählungen suchen. Eine Möglichkeit, dies zu erreichen, ist der Scan-Vorgang. Denken Sie jedoch daran, dass der Scanvorgang die gesamte Tabelle durchsucht und daher viel Durchsatz verbraucht, sodass alle Abfragevorgänge in dieser Dauer eine eingeschränkte Ausnahme erhalten. Und selbst wenn man bedenkt, dass der Scan die resultierende Anzahl von 1 MB Größe begrenzt, müssen Sie wiederholte Scan-Operationen durchführen, um die tatsächliche Anzahl von Elementen zu erhalten, wenn die Tabelle sehr groß ist. Dies erfordert, eine benutzerdefinierte Abfragelogik zu schreiben und unvermeidbare Drosselung in Abfrageoperationen zu behandeln.

Eine bessere Lösung, die mir in den Sinn kommt, ist die Gesamtanzahl der Artikel für solche Tabellen in einer separaten Tabelle zu halten, wo jeder Artikel Tabellenname als Hash-Schlüssel und die Gesamtzahl der Elemente in dieser Tabelle hat Nicht-Schlüsselattribut Sie können diese Tabelle, die möglicherweise als "TotalNumberOfItemsPerTable" bezeichnet wird, aktualisieren, indem Sie atomare Aktualisierungsvorgänge durchführen, um die Gesamtzahl der Elemente für eine bestimmte Tabelle zu erhöhen/verringern.

Kein Problem der Drosselung oder 1MB Grenze.

Darüber hinaus können Sie dieses Konzept auf noch mehr Granularität erweitern, um beispielsweise die Gesamtzahl der mit einem Hashschlüssel übereinstimmenden Elemente oder beliebige Kriterien, die Sie in Stringform codieren können, zu ändern. TotalNumberOfItemsInSomeCollection "oder" TotalNumberOfItemsMatchingSomeCriteria ". Diese Tabellen können dann Einträge für die Anzahl der Elemente pro Tabelle, pro Sammlung oder Elemente enthalten, die mit bestimmten Kriterien übereinstimmen.

0

Dies ist in dem AWS Tabellenübersicht Bildschirm unter dem Abschnitt 'Tabelle Details', Feld 'Item count' ab sofort verfügbar. Es scheint nur ein Absturz von DescribeTable zu sein und stellt fest, dass es ungefähr alle sechs Stunden aktualisiert wird.

0

Hier ist, wie ich die genaue Punktezählung auf meinen Milliarden Datensätze DynamoDB Tisch zu bekommen:

hive>

set dynamodb.throughput.write.percent = 1; 
set dynamodb.throughput.read.percent = 1; 
set hive.execution.engine = mr; 
set mapreduce.reduce.speculative=false; 
set mapreduce.map.speculative=false; 

CREATE EXTERNAL TABLE dynamodb_table (`ID` STRING,`DateTime` STRING,`ReportedbyName` STRING,`ReportedbySurName` STRING,`Company` STRING,`Position` STRING,`Country` STRING,`MailDomain` STRING) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "BillionData", "dynamodb.column.mapping" = "ID:ID,DateTime:DateTime,ReportedbyName:ReportedbyName,ReportedbySurName:ReportedbySurName,Company:Company,Position:Position,Country:Country,MailDomain:MailDomain"); 

SELECT count(*) FROM dynamodb_table; 

* Sie einen EMR-Cluster haben sollten, die mit Hive und DynamoDB Rekord Handler installiert kommen. * Mit diesem Befehl gibt der DynamoDB-Handler in der Struktur "PARALLEL SCANS" mit mehreren Mapreduce-Mappern (AKA Workers) aus, die auf verschiedenen Partitionen arbeiten, um die Anzahl zu erhalten. Dies ist viel effizienter und schneller als bei normalen Scans.
* Sie müssen bereit sein zu stoßen Lesen Sie die Kapazität für einen bestimmten Zeitraum sehr hoch. * Auf einem anständigen (20 Knoten) Cluster, mit 10000 RCU, dauerte es 15 Minuten, um auf Milliarden Datensätze zu zählen Ca.
* Neue Schreibvorgänge in dieser DDB-Tabelle während dieses Zeitraums führen zu einer inkonsistenten Zählung.

Verwandte Themen