Wie implementiere ich eine Paginierung in Amazon DynamoDB?

Lesedauer: 3 Minute
0

Wenn ich einen Abfrage- oder Scanvorgang verwende, um Elemente aus einer Amazon DynamoDB-Tabelle abzurufen, gibt die Antwort nicht die vollständigen Ergebnisse zurück.

Lösung

Dieses Problem tritt aufgrund der folgenden beiden Bedingungen auf:

  • Ihr erster Abfrage- oder Scanvorgang enthält ZuletztAusgewerteterSchlüssel in der Antwort.
  • Sie haben diesen Schlüssel nicht als ExklusiverStartschlüssel für die nächste Anforderung verwendet, um einen nachfolgenden Vorgang auszuführen.

Um dieses Problem zu beheben, implementieren Sie eine Paginierung für Ihre DynamoDB-Tabelle. Paginierung ist der Prozess des Sendens nachfolgender Anforderungen, um fortzufahren, wenn eine vorherige Anforderung unvollständig ist. Ein Abfrage- oder Scanvorgang in DynamoDB gibt möglicherweise unvollständige Ergebnisse zurück und erfordert nachfolgende Anfragen, um die gesamte Ergebnismenge abzurufen. Dies liegt daran, dass DynamoDB die Ergebnisse eines Abfrage- oder Scanvorgangs paginiert und in einem einzigen Vorgang maximal 1 MB an Daten zurückgibt. Das Datenmaximum ist eine feste Grenze in DynamoDB. Bei der Paginierung werden die Ergebnisse der Scan- und Abfrageoperationen in Datenseiten aufgeteilt, die 1 MB oder kleiner sind.

Verwenden Sie die integrierte Paginierungsfunktion, um die Paginierung in Amazon DynamoDB zu implementieren. Führen Sie einen Befehl aus, der diesem Beispiel ähnelt:

use DynamoDB.Paginator.Query.paginate

client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
params = {}

for page in paginator.paginate(params):
# do something

Sie können Ihre Ergebnisse auch paginieren und Seite für Seite abrufen. Um festzustellen, ob das Ergebnis das Element ZuletztAusgewerteterSchlüssel enthält, überprüfen Sie das Low-Level-Ergebnis eines Scan- oder Abfragevorgangs. Verwenden Sie einen anderen Scan- oder Abfragevorgang mit denselben Parametern, um die verbleibenden Ergebnisse zu erhalten. Verwenden Sie für den zweiten Vorgang den ZuletztAusgewerteterSchlüssel als den ExklusiverStartschlüssel-Parameter. Wenn das Ergebnis den ZuletztAusgewerteterSchlüssel-Wert nicht enthält, gibt es keine abzurufenden Elemente.

Weitere Informationen finden Sie unter Paginieren von Tabellenabfrageergebnissen und Paginieren der Ergebnisse.

Um ZuletztAusgewerteterSchlüssel zur Implementierung einer Paginierung in Boto3 zu verwenden, führen Sie einen Befehl aus, der diesem Beispiel ähnelt:

from __future__ import print_function  # Python 2/3 compatibility
import boto3
from botocore.exceptions import ClientError

# Create Client
session = boto3.session.Session()
dynamoDbClient = session.client('dynamodb')

table_name = 'AmazonBins'

# Track number of Items read
item_count = 0

try:    
    # Get the first 1MB of data    
    response = dynamoDbClient.scan(
        TableName=table_name
    )

except ClientError as error:
    print("Something went wrong: ")
    print(error.response['ResponseMetadata'])

# Track number of Items read
item_count += len(response['Items'])

# Paginate returning up to 1MB of data for each iteration
while 'LastEvaluatedKey' in response:
    try:
        response = dynamoDbClient.scan(
            TableName=table_name,
            ExclusiveStartKey=response['LastEvaluatedKey']
        )
        # Track number of Items read
        item_count += len(response['Items'])

    except ClientError as error:
        print("Something went wrong: ")
        print(error.response['ResponseMetadata'])

print("Total number of items found: {}".format(item_count))
AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten