一尘不染

从哈希键检索不同的值-DynamoDB

python

我有一个dynamodb表来存储电子邮件属性信息。我在电子邮件上有一个哈希键,在时间戳(数字)上有范围键。使用电子邮件作为哈希键的最初想法是按电子邮件查询所有电子邮件。但是我想做的一件事是检索所有电子邮件ID(在哈希键中)。我为此使用了boto,但不确定如何检索不同的电子邮件ID。

我当前提取10,000条电子邮件记录的代码是

conn=boto.dynamodb2.connect_to_region('us-west-2')
email_attributes = Table('email_attributes', connection=conn)
s = email_attributes.scan(limit=10000,attributes=['email'])

但是要检索不同的记录,我将必须进行全表扫描,然后在代码中选择不同的记录。我的另一个想法是维护另一个表,该表将仅存储这些电子邮件并进行有条件的写入,以查看是否存在电子邮件ID(如果不存在),然后写入。但是我试图考虑这是否会更昂贵,并且将是有条件的写入。

Q1.) Is there a way to retrieve distinct records using a DynamoDB scan?
Q2.) Is there a good way to calculate the cost per query?

阅读 183

收藏
2021-01-20

共1个答案

一尘不染

使用DynamoDB扫描,您需要在客户端上过滤掉重复项(在您的情况下,使用boto)。即使使用反向架构创建GSI,您仍然会得到重复的副本。给定一个名为stamped_emails的email_id
+ timestamp的H + R表,所有唯一的email_ids的列表是H + R
stamped_emails表的实例化视图。您可以在stamped_emails表上启用DynamoDB流,将Lambda函数订阅到stamped_emails的Stream,该函数将PutItem(email_id)放置到名为emails_only的仅散列表中。然后,您可以扫描emails_only,并且不会重复。

最后,关于您的成本问题,即使您仅从这些项目中请求某些计划的属性,Scan也会读取整个项目。其次,Scan必须通读每一项,即使它已由FilterExpression(条件表达式)过滤掉了。第三,扫描顺序读取项目。这意味着出于计量目的,每个扫描调用都被视为一个大读取。这样做的成本含义是,如果“扫描”呼叫读取200个不同的项目,则不一定要花费100个RCU。如果每个项目的大小为100字节,则该扫描调用将花费ROUND_UP((20000字节/
1024 kb /字节)/ 8 kb / EC RCU)= 3
RCU。即使此调用仅返回123个项目,如果“扫描”必须读取200个项目,在这种情况下也会产生3个RCU。

2021-01-20