Wie man Amazon DynamoDB abfragt

Wie man Amazon DynamoDB abfragt

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Jul 23, 2020

Auf einen Blick: Das Abfragen von Amazon DynamoDB erfordert die Beherrschung seiner einzigartigen Syntax, insbesondere der Hash- und Sortierschlüssel. Dieser Leitfaden bietet einen Überblick über grundlegende Abfrageoperationen, einschließlich Schlüsselbedingungs- und Filterausdrücke sowie Beispiele und Einrichtungsanweisungen.

  • Abfragen benötigen einen Hashschlüssel und können einen Sortierschlüssel enthalten.
  • Das Verständnis von Schlüsselbedingungs- und Filterausdrücken ist für eine effektive Abfrage unerlässlich.

In diesem Artikel erklären wir die Grundlagen von DynamoDB-Abfragen . Die Abfragesyntax unterscheidet sich deutlich von der anderer Datenbanken, daher braucht es einige Zeit, sich daran zu gewöhnen.

Hash-Schlüssel in DynamoDB

Der Hauptgrund für diese Komplexität ist, dass man DynamoDB ohne den Hash-Schlüssel nicht abfragen kann. Es ist also nicht erlaubt, die gesamte Datenbank abzufragen. Das bedeutet, dass man in anderen Datenbanken nicht das machen kann, was man einen vollständigen Tabellenscan nennen würde.

Der primäre (Partitions-)Schlüssel kann jedoch ein zweites Attribut enthalten, das als Sortierschlüssel bezeichnet wird. Die Schlüsselabfragebedingung muss = (gleich) sein. Aber Operatoren für den Sortierschlüssel können sein:

  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • Zwischen

Jede Abfrage besteht aus zwei unterschiedlichen Teilen:

  1. Die Schlüsselbedingungsabfrage (d. h. der Partitionsschlüssel-Hash) und optional der Sortierschlüssel
  2. Der Filter-Ausdruck (egal welches andere Attribut Sie anfragen möchten)

Wir geben unten einige Beispiele, benötigen aber zunächst einige Daten:

Lastprobendaten

  1. Installiere DynamoDB und führe es lokal aus, wie wir in "Wie man Daten in DynamoDB hinzufügt" erklärt haben.
  2. Installiere den Node, damit wir etwas JavaScript-Code ausführen können.
  3. Installiere das Amazon SDK mit npm, das Teil von Node ist:
  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • Zwischen
    npm install aws-sdk

Führe diese Programme aus den Amazon-JavaScript-Beispielen aus:

  1. Erstellen Sie die Movies-Tabelle, indem Sie MoviesCreateTable.js ausführen.
  2. Laden Sie die Beispieldaten hier herunter und entpacken Sie sie.
  3. Lade einige Daten, indem du MoviesLoadData ausführst.

Inspizieren Sie die Daten

Schauen Sie sich den oberen Teil der Datendatei an. Es handelt sich um eine Filmdatenbank, die verschachtelte JSON-Felder und Arrays enthält. Sie ist also als Lehrübung konzipiert.

    {
        "year": 2013,
        "title": "Rush",
        "info": {
            "directors": ["Ron Howard"],
            "release_date": "2013-09-02T00:00:00Z",
            "rating": 8.3,
            "genres": [
                "Action",
                "Biography",
                "Drama",
                "Sport"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
            "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
            "rank": 2,
            "running_time_secs": 7380,
            "actors": [
                "Daniel Bruhl",
                "Chris Hemsworth",
                "Olivia Wilde"
            ]
        }
    }

Tabelle beschreiben

Sie können überprüfen, ob die Daten geladen wurden mit:

    aws dynamodb describe-table   --table-name Movies   --endpoint-url http://localhost:8000

Hier ist der erste Eintrag.

    {
    "Table": {
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Movies", 
        "AttributeDefinitions": [
            {
                "AttributeName": "year", 
                "AttributeType": "N"
            }, 
            {
                "AttributeName": "title", 
                "AttributeType": "S"
            }
        ], 
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0, 
            "WriteCapacityUnits": 10, 
            "LastIncreaseDateTime": 0.0, 
            "ReadCapacityUnits": 10, 
            "LastDecreaseDateTime": 0.0
        }, 
        "TableSizeBytes": 2095292, 
        "TableName": "Movies", 
        "TableStatus": "ACTIVE", 
        "KeySchema": [
            {
                "KeyType": "HASH", 
                "AttributeName": "year"
            }, 
            {
                "KeyType": "RANGE", 
                "AttributeName": "title"
            }
        ], 
        "ItemCount": 4608, 
        "CreationDateTime": 1595056037.797
    }
}
  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • Zwischen

Wir werden die Amazon CLI-Kommandozeile verwenden, um Abfragen auszuführen. Wenn Sie eines der Programmiersprachen-SDKs verwenden, sind die Prinzipien dieselben. Der einzige Teil, der variiert, ist die Syntax.

Abfragen bestehen aus zwei Teilen:

Abfragestruktur

  1. Schlüsselbedingungsausdruck
  2. Filter-Ausdruck

Schlüsselbedingungsausdruck

Der Schlüsselbedingungsausdruck kann den Partitionsschlüssel und optional den Sortierschlüssel enthalten. Dieser Primärschlüssel nennt DynamoDB den Partitionsschlüssel. Man kann auch einen zweiten Schlüssel haben, der Sortierschlüssel genannt wird. In der Movies-Datenbank ist der Name des Partitionsschlüssels das Jahr und der Sortierschlüssel der Titel. Der Ausdruck der Partitionsschlüssel-Abfrage erlaubt nur Gleichgewichte mit (=). Der Sortierschlüssel erlaubt

  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • Zwischen

Die Amazon-Stichprobendaten enthalten ein reserviertes Wort, das Jahr. Wir müssen uns also mit dieser Komplexität von Anfang an auseinandersetzen.

Die Abfrage ist unten. Wir verwenden Backslashes (\) nach jeder Zeile, weil das das Fortsetzungszeichen in der Bash-Shell ist. Und wir setzen aus demselben Grund ein einzelnes Anführungszeichen (') um JSON, damit es Zeilen überspannen kann.

    aws dynamodb query  \
     --endpoint-url http://localhost:8000 \
     --table-name Movies    \
    --key-condition-expression "#yr = :yyyy"     \
    --expression-attribute-names '{"#yr": "year"}'     \
   --expression-attribute-values  '{ ":yyyy":{"N":"2010"}}'

Lassen Sie uns jeden Teil der Abfrage aufschlüsseln:

--Schlüsselbedingung-Ausdruck

#yr = :yyyy

Das Format dieses Ausdrucks ist:

Partitionsschlüsselname = Platzhalter

Und Sie könnten einen Sortierschlüssel hinzufügen, der für diese Datenbank Titel ist. Aber wir wollen ihn hier nicht haben, da wir nach einem Titel suchen und nicht nach einem suchen.

Das Pound-(#)-Zeichen bedeutet, dass wir den Partitionsschlüssel-Feldnamen im Parameter expression-attribute-names neu definieren, weil es ein reserviertes Wort ist. Normalerweise gibt man einfach den Feldnamen ein. Aber man kann kein Jahr verwenden, da es ein reserviertes Wort ist.

Der Doppelpunkt (:) ist ebenfalls ein Platzhalter. Das bedeutet, dass wir das unten im Schlüssel-Bedingungs-Ausdruck neu definieren

--expression-attribute-names '{"#yr": "year"}' Hier geben wir einen Alias für das Feldjahr an, da rein reserviertes Wort ist, was bedeutet, dass man es nicht als Feldnamen verwenden kann.
--expression-attribute-values '{ ":yyyy":{"N":"2010"}}'

Betrachten Sie dies als Erweiterung oder Definition des Platzhalters, der in den Schlüssel- oder Filterausdrücken verwendet wird (unten kommen wir zu den Filterausdrücken). Mit anderen Worten, in der Schlüsselbedingung schrieben wir: :yyyy . Das ist nur ein temporärer Platzhalter. Wir definieren, welchen Wert hier gilt,

'{ ":yyyy":{"N":"2010"}}'

Das N bedeutet, dass es eine Zahl ist. S ist ein String. B ist binär.

2010 ist der Zielwert.

Denken Sie daran, dass die Schlüsselbedingung dazu dient, eine Menge oder Datensätze basierend auf ihrer Partition auszuwählen. Es handelt sich um einen zweistufigen Prozess, bei dem eine Teilmenge der Datenbank gezogen und diese Teilmenge im Filterausdruck abgefragt wird.

Im untenstehenden Beispiel wollen wir alle Filme des Jahres 2010 zeigen, die eine Bewertung über 8,5 haben. Die (1) Schlüsselbedingung erhält das Jahr und (2) der Filterausdruck ermöglicht es Ihnen, alle Filme aus dem Jahr 2010 zu bewerten. Sie ist so für die Geschwindigkeit konzipiert, indem die Datenmenge zur Abfrage reduziert wird.

    aws dynamodb query  \
     --endpoint-url http://localhost:8000 \
     --table-name Movies    \
    --key-condition-expression "#yr = :yyyy"     \
    --expression-attribute-names '{"#yr": "year"}'     \
   --expression-attribute-values  '{ ":yyyy":{"N":"2010"}}' \
 --filter-expression 'info.rating > :rating' \
--expression-attribute-values '{
   ":yyyy":{"N":"2010"},
    ":rating": { "N": "8.5" }
}'

Der Filterausdruck hat dieselbe Syntax wie die Schlüsselbedingung, aber es gibt ein paar Punkte zu beachten.

--filter-expression 'info.rating > :rating' \

Der Filter-Ausdruck ist, wie die Schlüsselbedingung, nur ein Attribut links, ein Operator in der Mitte und ein Platzhalter rechts. Mit anderen Worten, es ist kein JSON, während wir JSON anderswo verwenden.

Bewertung ist unter Infos verschachtelt. Also schreiben wir Info.Rating.

--expression-attribute-values '{

":yyyyy":{"N":"2010"},

":bewertung": { "N": "8.5" }

}'

In der obigen Schlüsselbedingungsabfrage haben wir genau denselben Parameter verwendet. Hier verwenden wir die JSON-Syntax:

--expression-attribute-values '{ ":yyyy":{"N":"2010"}}'

Der einzige Unterschied ist, dass wir jetzt zwei Platzhalter haben (:yyyy und :rating), also brauchen wir zwei Zeilen in diesem JSON:

--expression-attribute-values '{

":yyyyy":{"N":"2010"},

":bewertung": { "N": "8.5" }

}'

Das verdeutlicht auch, dass der Filterausdruck immer dieselbe Abfrageschlüsselbedingung enthalten muss. Also wiederholst du es.

Zusätzliche Ressourcen

Mehr zu diesem Thema finden Sie im BMC Big Data & Machine Learning Blog oder schauen Sie sich diese Ressourcen an:

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Interessieren Sie sich für mehr von BMC?

The Brief ist unsere monatliche E-Mail zum Mainframe und zur Enterprise-Orchestrierung: Recherchen, Kundenberichte, Produktnachrichten, Events.

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Sie haben The Brief abonniert

Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.