DynamoDB在Python中查询(使用GroupBy计数)

时间:2017-01-21 14:26:18

标签: python twitter amazon-dynamodb boto3

这可能是微不足道的,但是我加载了一个本地DynamoDB实例,其中包含了我聚合的30GB的Twitter数据。

主键是id(来自Tweet JSON的tweet_id),我还存储了日期/文本/用户名/地理编码。

我基本上对两个主题的提及感兴趣(让我们说" Bees"和#34; Booze")。 我想按天计算每个州的每个人。

所以到最后,我应该知道每个州,在某一天提到了多少次。我想将它作为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:属性名是保留关键字;保留关键字:location"。我该如何解决这个问题?

NVM我明白了。答案是研究ExpressionAttributeNames(参见:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html

1 个答案:

答案 0 :(得分:2)

是的,扫描表格" Booze"并计算结果中的项目应该给你总计数。请注意,您需要执行递归扫描,直到LastEvaluatedKey为空。

同时参考exclusive start key

Scan

修改: -

是的,代码看起来不错。有一点需要注意,结果集不会总是包含100个项目。请参考下面的LIMIT定义(与SQL数据库不同)。

  

限制 - (整数)要评估的最大项目数(不是   必然是匹配项目的数量)。如果DynamoDB处理   处理结果时达到限制的项目数量,它会停止   操作并返回到该点的匹配值,并且a   键入LastEvaluatedKey以应用于后续操作,以便   你可以在你离开的地方接你。另外,如果处理了数据集   在DynamoDB达到此限制之前,大小超过1 MB,它会停止   操作并返回匹配值,直到限制和一个键   在LastEvaluatedKey中应用于后续操作以继续   操作。有关更多信息,请参阅Amazon中的查询和扫描   DynamoDB开发人员指南。