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

Retrieve distinct values from the hash key - DynamoDB

我有一个 dynamodb table 来存储电子邮件属性信息。我在电子邮件上有一个散列键,在时间戳(数字)上有范围键。使用电子邮件作为哈希键的最初想法是按每个电子邮件查询所有电子邮件。但我想做的一件事是检索所有电子邮件 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']) 

但是要检索不同的记录,我必须进行完整的 table 扫描,然后在代码中选择不同的记录。我的另一个想法是维护另一个 table,它将只存储这些电子邮件并进行条件写入以查看电子邮件 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?

使用 DynamoDB 扫描,您需要在客户端过滤掉重复项(在您的情况下,使用 boto)。即使您使用反向模式创建 GSI,您仍然会得到重复项。给定 email_id+时间戳的 H+R table 称为 stamped_emails,所有唯一 email_id 的列表是 H+R stamped_emails 的物化视图table。您可以为 stamped_emails' Stream 启用一个 DynamoDB Stream on the stamped_emails table, subscribe a Lambda 函数,它执行一个 PutItem (email_id) 到一个名为 emails_only 的 Hash-only table。然后,您可以扫描 emails_only 并且不会得到重复项。

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