[英]DynamoDB Querying in Python (Count with GroupBy)
這可能是微不足道的,但是我加載了一個本地DynamoDB實例,其中包含我聚合的30GB的Twitter數據。
主鍵是id(來自Tweet JSON的tweet_id),我還存儲了日期/文本/用戶名/地理代碼。
我基本上對提到兩個主題感興趣(比如說“蜜蜂”和“瘋狂”)。 我想按狀態逐個逐一統計這些數據。
因此,最后,我應該知道每個州在一天中被提及多少次。 而且我想將其導出為CSV或其他內容以供以后分析是很好的。
我這樣做的一些問題...
首先,地理編碼信息是[緯度,經度]元組,因此對於每個條目,我都需要將其映射到狀態。 我能做的。
其次,最有效的方法是遍歷每個條目並手動檢查它是否包含兩個關鍵詞,然后每個字典都有一個映射日期/位置/計數的字典嗎?
編輯:
由於花了20個小時將所有數據加載到表中,因此我不想刪除並重新創建它。 也許我應該創建一個全局二級索引(?),並使用它來搜索查詢中的其他字段? 這樣,我不必掃描所有內容。 那是正確的軌道嗎?
編輯2:
好吧,由於該表位於我的本地計算機上,所以我可以只使用昂貴的操作(如“掃描”)就可以了嗎?
因此,如果我做了這樣的事情:
query = table.scan(
FilterExpression=Attr('text').contains("Booze"),
ProjectionExpression='id, text, date, geo',
Limit=100)
並對每個關鍵字進行一次掃描,然后我就可以瀏覽得到的過濾列表,並在給定的一天獲得針對每個州的每個主題的提及計數,對嗎?
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
兩個關鍵字都是這樣的。 這樣,我將能夠遍歷生成的過濾集並執行我想要的操作(在這種情況下,請確定位置和日期並使用該信息創建最終數據集)。 對?
編輯4
如果我添加:
ProjectionExpression='date, location, user, text'
進入掃描請求時,出現錯誤消息“ botocore.exceptions.ClientError:調用掃描操作時發生錯誤(ValidationException):無效的ProjectionExpression:屬性名稱是保留關鍵字; reserved關鍵字:location”。 我該如何解決?
NVM我明白了。 答案是調查ExpressionAttributeNames(請參閱: http : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html )
是的,掃描表格中的“ Booze”並計算結果中的項目,即可得出總數。 請注意,您需要進行遞歸掃描,直到LastEvaluatedKey為null。
也請參考獨占啟動鍵 。
編輯:-
是的,代碼看起來不錯。 需要注意的一件事是,結果集並不總是包含100個項目。 請參考下面的LIMIT定義(與SQL數據庫不同)。
限制—(整數)要評估的最大項目數(不一定是匹配的項目數)。 如果DynamoDB在處理結果時處理的項目數達到最大限制,它將停止操作並返回到該點為止的匹配值,並返回LastEvaluatedKey中的一個鍵以應用於后續操作,以便您可以在要提取的位置進行提取離開。 此外,如果在DynamoDB達到此限制之前處理的數據集大小超過1 MB,它將停止該操作並返回匹配的值直至該限制,並返回LastEvaluatedKey中的鍵以應用於后續操作以繼續該操作。 有關更多信息,請參閱Amazon DynamoDB開發人員指南中的查詢和掃描。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.