2015-05-01 2 views
5

У меня есть таблица dynamodb для хранения информации атрибута электронной почты. У меня есть хэш-ключ в электронном письме, ключ диапазона на отметке времени (число). Первоначальная идея использования электронной почты как хеш-ключа - запрашивать все электронные письма по электронной почте. Но одна вещь, которую я пытаюсь сделать, - это восстановить все идентификаторы электронной почты (в хэш-ключ). Я использую boto для этого, но я не уверен, как получить различные идентификаторы электронной почты.Извлечь отдельные значения из хэш-ключа - DynamoDB

Мой текущий код тянуть 10000 электронной записи является

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

Но для получения различных записей, я должен буду сделать полное сканирование таблицы, а затем выбрать различные записи в коде. Еще одна идея, которую я имею, заключается в том, чтобы сохранить другую таблицу, которая будет просто хранить эти письма и делать условные записи, чтобы увидеть, существует ли идентификатор электронной почты, если не писать. Но я пытаюсь подумать, будет ли это дороже, и это будет условная запись.

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? 

ответ

2

Использование DynamoDB Scan, вы должны отфильтровать дубликаты на стороне клиента (в вашем случае, используя Boto). Даже если вы создадите GSI с обратной схемой, вы все равно получите дубликаты. Учитывая таблицу H + R с отметкой по электронной почте mail_id + с именем stamped_emails, список всех уникальных email_ids является материализованным представлением таблицы штампов с отметкой H + R. Вы можете включить DynamoDB Stream в таблице stamped_emails, подписать функцию Lambda потоку stamped_emails, который делает PutItem (email_id) в таблицу только для Хэша, называемую emails_only. Затем вы можете сканировать почту электронной почты_источно, и вы не получите дубликатов.

Наконец, в отношении вашего вопроса о стоимости Scan будет считывать целые элементы, даже если вы запрашиваете только определенные проецируемые атрибуты из этих элементов. Во-вторых, Scan должен считывать каждый элемент, даже если он отфильтровывается с помощью выражения FilterExpression (выражение условий). В-третьих, Scan считывает элементы последовательно. Это означает, что каждый вызов сканирования рассматривается как один большой для целей измерения. Это связано с тем, что если вызов Scan считывает 200 различных элементов, это не обязательно будет стоить 100 RCU. Если размер каждого из этих элементов составляет 100 байт, этот вызов сканирования будет стоить ROUND_UP ((20000 байт/1024 кбит/байт)/8 kb/EC RCU) = 3 RCU. Даже если этот вызов возвращает только 123 элемента, если сканирование должно было читать 200 элементов, в этой ситуации вы бы взяли 3 RCU.

+0

Здравствуйте, Александр, можно сканировать 1000 предметов, а затем сказать fetch 10, а затем сканировать следующие 1000 предметов? Этот подход ужасно дорог? – Marin

Смежные вопросы