メールの属性情報を保存するdynamodbテーブルがあります。メールにハッシュキー、タイムスタンプ(番号)に範囲キーがあります。電子メールをハッシュキーとして使用するための最初のアイデアは、すべての電子メールを電子メールごとにクエリすることです。しかし、私がやろうとしていることの1つは、すべての電子メール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'])
ただし、個別のレコードを取得するには、全表スキャンを実行してから、コード内の個別のレコードを選択する必要があります。私が持っているもう1つのアイデアは、これらの電子メールを格納し、条件付き書き込みを実行して電子メール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 + Rstamped_emailsテーブルのマテリアライズドビューです。 Stamped_emailsテーブルで DynamoDB Stream を有効にし、PutItem(email_id)を実行するstamped_emailsのStreamに Lambda 関数をemails_onlyというハッシュのみのテーブルにサブスクライブできます。次に、emails_onlyをスキャンすると、重複は発生しません。
最後に、コストに関する質問に関して、スキャンは、アイテムから特定の投影された属性のみを要求した場合でも、アイテム全体を読み取ります。次に、Scanは、FilterExpression(条件式)によってフィルターで除外されている場合でも、すべてのアイテムを読み取る必要があります。第三に、スキャンはアイテムを順番に読み取ります。つまり、各スキャン呼び出しは、計測の目的で1つの大きな読み取りとして扱われます。これのコストへの影響は、スキャン呼び出しが200の異なるアイテムを読み取る場合、必ずしも100RCUのコストがかかるとは限らないということです。これらの各項目のサイズが100バイトの場合、そのスキャン呼び出しのコストはROUND_UP((20000バイト/ 1024 kb /バイト)/ 8 kb/EC RCU)= 3RCUになります。この呼び出しで123アイテムしか返されない場合でも、スキャンで200アイテムを読み取る必要がある場合、この状況では3RCUが発生します。