2017-01-21 1 views
0

Dies kann trivial sein, aber ich habe eine lokale DynamoDB-Instanz mit 30 GB im Wert von Twitter-Daten, die ich aggregiert.DynamoDB Abfragen in Python (mit GroupBy zählen)

Der Primärschlüssel ist ID (Tweet_id aus dem Tweet JSON), und ich speichern auch das Datum/text/Benutzername/Geocode.

Ich bin grundsätzlich interessiert an Erwähnungen von zwei Themen (sagen wir "Bienen" und "Schnaps"). Ich möchte jeden Staat von Tag zu Tag zählen.

Also am Ende sollte ich für jeden Staat wissen, wie oft jeder an einem bestimmten Tag erwähnt wurde. Und ich denke, es wäre schön, das als CSV oder etwas für spätere Analysen zu exportieren.

Einige Probleme ich tun dies ... hatte

Zuerst wird die geocode info ist ein Tupel von [Breitengrad, Längengrad] für jeden Eintrag so, ich brauche, dass in einen Zustand abzubilden. Das kann ich tun.

Zweitens, ist der effizienteste Weg, dies zu tun, um jeden Eintrag zu durchlaufen und manuell zu überprüfen, ob es eine Erwähnung von einem Schlüsselwort enthält und dann ein Wörterbuch für jedes, das das Datum/Ort/Anzahl abbildet?

EDIT:

Da es mir 20 Stunden in Anspruch nahm alle Daten in meinem Tisch zu laden, ich will nicht, es löschen und neu zu erstellen. Vielleicht sollte ich einen globalen sekundären Index (?) erstellen und damit andere Felder in einer Abfrage suchen? So muss ich nicht alles scannen. Ist das der richtige Weg?

EDIT 2:

Nun, da die Tabelle auf meinem Computer lokal soll ich mit nur mit teueren Operationen wie ein Scan direkt in Ordnung sein?

Also, wenn ich so etwas wie dies tat:

query = table.scan(
    FilterExpression=Attr('text').contains("Booze"), 
    ProjectionExpression='id, text, date, geo', 
    Limit=100) 

Und hat eine Abtastung für jedes Keyword, dann würde ich in der Lage sein, durch die sich ergebende gefilterte Liste zu gehen und einen Count von für jede der einzelnen Themen erwähnt an einem bestimmten Tag, oder?

EDIT3:

response = table.scan(
    FilterExpression=Attr('text').contains("Booze"), 
    Limit=100) 
//do something with this set 
while 'LastEvaluatedKey' in response: 
    response = table.scan(
     FilterExpression=Attr('text').contains("Booze"), 
     Limit=100, 
     ExclusiveStartKey=response['LastEvaluatedKey'] 
    ) 
    //do something with each batch of 100 entries 

So etwas wie das für beide Schlüsselwörter. Auf diese Weise kann ich die resultierende gefilterte Menge durchgehen und tun, was ich will (in diesem Fall, finde den Ort und den Tag heraus und erstelle einen endgültigen Datensatz mit dieser Information). Recht?

EDIT 4

Wenn ich hinzufügen:

ProjectionExpression='date, location, user, text' 

in die Scan-Anfrage, ich erhalte eine Fehlermeldung sagen „botocore.exceptions.ClientError: Ein Fehler ist aufgetreten (Validation), wenn der Scan-Aufruf Operation: Invalid ProjectionExpression: Attributname ist ein reserviertes Schlüsselwort; reserviertes Schlüsselwort: location ". Wie repariere ich das?

NVM Ich habe es. Antwort ist in ExpressionAttributeNames (siehe: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html)

Antwort

1

Ja, Scannen der Tabelle für "Schnaps" und das Zählen der Elemente im Ergebnis sollte Ihnen die Gesamtzahl zählen. Bitte beachten Sie, dass Sie rekursiven Scan tun müssen, bis LastEvaluatedKey null ist.

Siehe auch exclusive start key.

Scan

EDIT: -

Ja, der Code sieht gut aus. Beachten Sie, dass das Ergebnis nicht immer 100 Elemente enthält. Bitte beachten Sie die LIMIT-Definition unten (nicht dasselbe wie SQL-Datenbank).

Limit — (Integer) The maximum number of items to evaluate (not necessarily the number of matching items). If DynamoDB processes the number of items up to the limit while processing the results, it stops the operation and returns the matching values up to that point, and a key in LastEvaluatedKey to apply in a subsequent operation, so that you can pick up where you left off. Also, if the processed data set size exceeds 1 MB before DynamoDB reaches this limit, it stops the operation and returns the matching values up to the limit, and a key in LastEvaluatedKey to apply in a subsequent operation to continue the operation. For more information, see Query and Scan in the Amazon DynamoDB Developer Guide.

+0

Ich aktualisiert mit einigen Beispielcode mit diesem Ansatz. Denke ich richtig darüber nach? – shishy

+0

schnelle Frage. Wenn ich ProjectionExpression = 'date, location, user, text' hinzufüge, bekomme ich eine Fehlermeldung "botocore.exceptions.ClientError: Ein Fehler ist aufgetreten (ValidationException) beim Aufruf des Scan-Vorgangs: Invalid ProjectionExpression: Attributname ist ein reserviertes Schlüsselwort; reserviert Stichwort: Standort ". Wie repariere ich das? – shishy

+0

Nvm Ich habe es. Antwort ist, sich ExpressionAttributeNames anzusehen. – shishy