Tabellen und Indizes scannen:. NET - Amazon-DynamoDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Tabellen und Indizes scannen:. NET

Die Scan-Operation liest alle Elemente einer Tabelle oder eines Indexes in Amazon DynamoDB.

Gehen Sie wie folgt vor, um eine Tabelle mit dem AWS SDK for .NET Low-Level API zu scannen:

  1. Erstellen Sie eine Instance der AmazonDynamoDBClient-Klasse.

  2. Erstellen Sie eine Instance der ScanRequest-Klasse und stellen Sie Parameter für die Scan-Operation bereit.

    Der einzige erforderliche Parameter ist der Tabellenname.

  3. Führen Sie die Scan-Methode aus und stellen Sie das ScanRequest-Objekt bereit, das Sie im vorherigen Schritt erstellt haben.

Die folgende Reply-Tabelle speichert Antworten für Forum-Threads.

Beispiel
>Reply ( <emphasis role="underline">Id</emphasis>, <emphasis role="underline">ReplyDateTime</emphasis>, Message, PostedBy )

Die Tabelle enthält alle Antworten zu verschiedenen Forum-Threads. Daher besteht der Primärschlüssel aus Id (Partitionsschlüssel) und ReplyDateTime (Sortierschlüssel). Der folgende C#-Codebeispiel scannt die gesamte Tabelle. Die ScanRequest-Instance gibt den Namen der zu scannenden Tabelle an.

Beispiel
AmazonDynamoDBClient client = new AmazonDynamoDBClient(); var request = new ScanRequest { TableName = "Reply", }; var response = client.Scan(request); var result = response.ScanResult; foreach (Dictionary<string, AttributeValue> item in response.ScanResult.Items) { // Process the result. PrintItem(item); }

Angeben eines optionalen Parameters

Die Scan-Methode unterstützt mehrere optionale Parameter. Beispielsweise können Sie optional einen Scan-Filter verwenden, um das Scan-Ergebnis zu filtern. In einem Scan-Filter können Sie eine Bedingung und einen Attributnamen angeben, für die Sie die Bedingung ausgewertet haben möchten. Weitere Informationen finden Sie unter Scan.

Der folgende C#-Code scannt die ProductCatalog-Tabelle, um Elemente zu finden, deren Preis kleiner als 0 ist. Das Beispiel gibt die folgenden optionalen Parameter an:

  • Ein Parameter FilterExpression, um nur die Elemente abzurufen, deren Preis kleiner als 0 ist (Fehlerbedingung).

  • Ein Parameter ProjectionExpression zum Angeben der Attribute, die für Elemente in den Abfrageergebnissen abgerufen werden.

Der folgende C#-Codeausschnitt scannt die ProductCatalog-Tabelle, um alle Elemente zu finden, deren Preis kleiner als 0 ist.

Beispiel
var forumScanRequest = new ScanRequest { TableName = "ProductCatalog", // Optional parameters. ExpressionAttributeValues = new Dictionary<string,AttributeValue> { {":val", new AttributeValue { N = "0" }} }, FilterExpression = "Price < :val", ProjectionExpression = "Id" };

Wahlweise können Sie auch die Seitengröße oder die Anzahl von Elementen pro Seite begrenzen, indem Sie den optionalen Parameter Limit hinzufügen. Bei jeder Ausführung der Scan-Methode erhalten Sie eine Ergebnisseite, die über die angegebene Anzahl von Elementen verfügt. Um die nächste Seite abzurufen, führen Sie die Scan-Methode erneut aus, indem Sie den Primärschlüsselwert des letzten Elements auf der vorherigen Seite angeben, damit die Scan-Methode den nächsten Elementsatz zurückgeben kann. Sie stellen diese Informationen in der Anforderung bereit, indem Sie die ExclusiveStartKey-Eigenschaft festlegen. Anfänglich kann diese Eigenschaft Null sein. Zum Abrufen von Folgeseiten müssen Sie diesen Eigenschaftswert für den Primärschlüssel des letzten Elements in der vorangegangenen Seite aktualisieren.

Im folgenden C#-Codebeispiel wird die ProductCatalog-Tabelle gescannt. In der Anforderung werden die optionalen Parameter Limit und ExclusiveStartKey angegeben. Die do/while-Schleife scannt eine Seite nach der anderen, bis die LastEvaluatedKey-Methode den Wert Null zurückgibt.

Beispiel
Dictionary<string, AttributeValue> lastKeyEvaluated = null; do { var request = new ScanRequest { TableName = "ProductCatalog", Limit = 10, ExclusiveStartKey = lastKeyEvaluated }; var response = client.Scan(request); foreach (Dictionary<string, AttributeValue> item in response.Items) { PrintItem(item); } lastKeyEvaluated = response.LastEvaluatedKey; } while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Beispiel — Scannen mit. NET

Das folgende C#-Codebeispiel bietet ein Arbeitsbeispiel, das die ProductCatalog-Tabelle scannt, um Elemente zu finden, deren Preis unter 0 liegt.

step-by-step Anweisungen zum Testen des folgenden Beispiels finden Sie unter. NETCodebeispiele.

using System; using System.Collections.Generic; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.Runtime; namespace com.amazonaws.codesamples { class LowLevelScan { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); static void Main(string[] args) { try { FindProductsForPriceLessThanZero(); Console.WriteLine("Example complete. To continue, press Enter"); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } } private static void FindProductsForPriceLessThanZero() { Dictionary<string, AttributeValue> lastKeyEvaluated = null; do { var request = new ScanRequest { TableName = "ProductCatalog", Limit = 2, ExclusiveStartKey = lastKeyEvaluated, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":val", new AttributeValue { N = "0" }} }, FilterExpression = "Price < :val", ProjectionExpression = "Id, Title, Price" }; var response = client.Scan(request); foreach (Dictionary<string, AttributeValue> item in response.Items) { Console.WriteLine("\nScanThreadTableUsePaging - printing....."); PrintItem(item); } lastKeyEvaluated = response.LastEvaluatedKey; } while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0); Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void PrintItem( Dictionary<string, AttributeValue> attributeList) { foreach (KeyValuePair<string, AttributeValue> kvp in attributeList) { string attributeName = kvp.Key; AttributeValue value = kvp.Value; Console.WriteLine( attributeName + " " + (value.S == null ? "" : "S=[" + value.S + "]") + (value.N == null ? "" : "N=[" + value.N + "]") + (value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray()) + "]") + (value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray()) + "]") ); } Console.WriteLine("************************************************"); } } }

Beispiel - paralleles Scannen mit. NET

Das folgende C#-Codebeispiel zeigt einen parallelen Scan. Das Programm löscht und erstellt die ProductCatalog-Tabelle neu. Anschließend werden die Daten in die Tabelle geladen. Wenn der Ladevorgang abgeschlossen ist, erzeugt das Programm mehrere Threads und gibt parallele Scan-Anforderungen aus. Zum Schluss druckt das Programm eine Zusammenfassung der Laufzeitstatistiken.

step-by-step Anweisungen zum Testen des folgenden Beispiels finden Sie unter. NETCodebeispiele.

using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.Runtime; namespace com.amazonaws.codesamples { class LowLevelParallelScan { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); private static string tableName = "ProductCatalog"; private static int exampleItemCount = 100; private static int scanItemLimit = 10; private static int totalSegments = 5; static void Main(string[] args) { try { DeleteExampleTable(); CreateExampleTable(); UploadExampleData(); ParallelScanExampleTable(); } catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } private static void ParallelScanExampleTable() { Console.WriteLine("\n*** Creating {0} Parallel Scan Tasks to scan {1}", totalSegments, tableName); Task[] tasks = new Task[totalSegments]; for (int segment = 0; segment < totalSegments; segment++) { int tmpSegment = segment; Task task = Task.Factory.StartNew(() => { ScanSegment(totalSegments, tmpSegment); }); tasks[segment] = task; } Console.WriteLine("All scan tasks are created, waiting for them to complete."); Task.WaitAll(tasks); Console.WriteLine("All scan tasks are completed."); } private static void ScanSegment(int totalSegments, int segment) { Console.WriteLine("*** Starting to Scan Segment {0} of {1} out of {2} total segments ***", segment, tableName, totalSegments); Dictionary<string, AttributeValue> lastEvaluatedKey = null; int totalScannedItemCount = 0; int totalScanRequestCount = 0; do { var request = new ScanRequest { TableName = tableName, Limit = scanItemLimit, ExclusiveStartKey = lastEvaluatedKey, Segment = segment, TotalSegments = totalSegments }; var response = client.Scan(request); lastEvaluatedKey = response.LastEvaluatedKey; totalScanRequestCount++; totalScannedItemCount += response.ScannedCount; foreach (var item in response.Items) { Console.WriteLine("Segment: {0}, Scanned Item with Title: {1}", segment, item["Title"].S); } } while (lastEvaluatedKey.Count != 0); Console.WriteLine("*** Completed Scan Segment {0} of {1}. TotalScanRequestCount: {2}, TotalScannedItemCount: {3} ***", segment, tableName, totalScanRequestCount, totalScannedItemCount); } private static void UploadExampleData() { Console.WriteLine("\n*** Uploading {0} Example Items to {1} Table***", exampleItemCount, tableName); Console.Write("Uploading Items: "); for (int itemIndex = 0; itemIndex < exampleItemCount; itemIndex++) { Console.Write("{0}, ", itemIndex); CreateItem(itemIndex.ToString()); } Console.WriteLine(); } private static void CreateItem(string itemIndex) { var request = new PutItemRequest { TableName = tableName, Item = new Dictionary<string, AttributeValue>() { { "Id", new AttributeValue { N = itemIndex }}, { "Title", new AttributeValue { S = "Book " + itemIndex + " Title" }}, { "ISBN", new AttributeValue { S = "11-11-11-11" }}, { "Authors", new AttributeValue { SS = new List<string>{"Author1", "Author2" } }}, { "Price", new AttributeValue { N = "20.00" }}, { "Dimensions", new AttributeValue { S = "8.5x11.0x.75" }}, { "InPublication", new AttributeValue { BOOL = false } } } }; client.PutItem(request); } private static void CreateExampleTable() { Console.WriteLine("\n*** Creating {0} Table ***", tableName); var request = new CreateTableRequest { AttributeDefinitions = new List<AttributeDefinition>() { new AttributeDefinition { AttributeName = "Id", AttributeType = "N" } }, KeySchema = new List<KeySchemaElement> { new KeySchemaElement { AttributeName = "Id", KeyType = "HASH" //Partition key } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 5, WriteCapacityUnits = 6 }, TableName = tableName }; var response = client.CreateTable(request); var result = response; var tableDescription = result.TableDescription; Console.WriteLine("{1}: {0} \t ReadsPerSec: {2} \t WritesPerSec: {3}", tableDescription.TableStatus, tableDescription.TableName, tableDescription.ProvisionedThroughput.ReadCapacityUnits, tableDescription.ProvisionedThroughput.WriteCapacityUnits); string status = tableDescription.TableStatus; Console.WriteLine(tableName + " - " + status); WaitUntilTableReady(tableName); } private static void DeleteExampleTable() { try { Console.WriteLine("\n*** Deleting {0} Table ***", tableName); var request = new DeleteTableRequest { TableName = tableName }; var response = client.DeleteTable(request); var result = response; Console.WriteLine("{0} is being deleted...", tableName); WaitUntilTableDeleted(tableName); } catch (ResourceNotFoundException) { Console.WriteLine("{0} Table delete failed: Table does not exist", tableName); } } private static void WaitUntilTableReady(string tableName) { string status = null; // Let us wait until table is created. Call DescribeTable. do { System.Threading.Thread.Sleep(5000); // Wait 5 seconds. try { var res = client.DescribeTable(new DescribeTableRequest { TableName = tableName }); Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName, res.Table.TableStatus); status = res.Table.TableStatus; } catch (ResourceNotFoundException) { // DescribeTable is eventually consistent. So you might // get resource not found. So we handle the potential exception. } } while (status != "ACTIVE"); } private static void WaitUntilTableDeleted(string tableName) { string status = null; // Let us wait until table is deleted. Call DescribeTable. do { System.Threading.Thread.Sleep(5000); // Wait 5 seconds. try { var res = client.DescribeTable(new DescribeTableRequest { TableName = tableName }); Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName, res.Table.TableStatus); status = res.Table.TableStatus; } catch (ResourceNotFoundException) { Console.WriteLine("Table name: {0} is not found. It is deleted", tableName); return; } } while (status == "DELETING"); } } }