gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:03:09 25 4
gpt4 key购买 nike

我有一个 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?

最佳答案

使用 DynamoDB 扫描,您需要在客户端过滤掉重复项(在您的情况下,使用 boto)。即使您使用反向模式创建 GSI,您仍然会得到重复项。给定一个名为 stamped_emails 的 email_id+timestamp 的 H+R 表,所有唯一 email_id 的列表是 H+R stamped_emails 表的物化 View 。您可以启用 DynamoDB Stream在 stamped_emails 表上,订阅 Lambda stamped_emails 的 Stream 函数,它对名为 emails_only 的仅哈希表执行 PutItem (email_id)。然后,您可以 Scan emails_only 并且不会得到重复项。

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

关于python - 从哈希键中检索不同的值 - DynamoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com