mac*_*cha 10 python boto nosql amazon-dynamodb
我有一个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'])
Run Code Online (Sandbox Code Playgroud)
但是要检索不同的记录,我将不得不进行全表扫描,然后在代码中选择不同的记录.我的另一个想法是维护另一个表,它只存储这些电子邮件并进行条件写入以查看是否存在电子邮件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?
Run Code Online (Sandbox Code Playgroud)
使用DynamoDB扫描,您需要在客户端过滤掉重复项(在您的情况下,使用boto).即使您使用反向架构创建GSI,您仍将获得重复项.给定一个名为stamped_emails的email_id + timestamp的H + R表,所有唯一email_id的列表是H + R stamped_emails表的物化视图.您可以在stamped_emails表上启用DynamoDB Stream,将一个Lambda函数订阅到stamped_emails的Stream,它将PutItem(email_id)发送到名为emails_only的仅哈希表.然后,您可以扫描emails_only,您将不会重复.
最后,关于有关费用的问题,即使您只是从这些项目请求某些预计属性,扫描也会读取整个项目.其次,扫描必须读取每个项目,即使它被FilterExpression(条件表达式)过滤掉.第三,扫描按顺序读取项目.这意味着每个扫描调用都被视为一个大读取用于计量目的.这样做的成本意味着如果扫描呼叫读取200个不同的项目,则不一定需要100 RCU.如果每个项目的大小为100字节,则该扫描调用将花费ROUND_UP((20000字节/ 1024 kb /字节)/ 8 kb/EC RCU)= 3 RCU.即使此调用仅返回123项,如果扫描必须读取200项,则在这种情况下会产生3个RCU.
| 归档时间: |
|
| 查看次数: |
9368 次 |
| 最近记录: |