2015-03-03 3 views
1

Я создал таблицу в AWS dynamoDb только с одним хэш-ключом. В настоящее время он содержит более 20 миллионов данных, и каждый день вводится несколько тысяч данных.Как сканировать данные с AWS dynamoDb постепенно

В последнее время я хочу получать эти данные с dynamoDb на локальный жесткий диск каждый день. Я написал небольшую программу для использования операций сканирования для их сохранения. Общий размер данных не намного больше, около 10G, но стоимость времени в процессе сканирования составляет около 5 часов в день. Разумеется, учитывая затраты, я не установил намного большую пропускную способность чтения.

Мой вопрос: есть ли способ сканировать эти данные поэтапно, а это значит, что мне нужно только скопировать недавно вставленные данные, но не всю базу данных. Однажды я попытался использовать withExclusiveStartKey, но он не смог найти недавно вставленные данные, возможно, потому, что lastKeyEvaluated описывает только последний ключ конкретного сегмента.

+1

«Сканирование» смотрит на всю таблицу. Если вы хотите сделать какой-то запрос только к новым элементам, вам нужно будет моделировать свои данные таким образом. Если вы только заботитесь о новых обновлениях, вы можете взглянуть на [DynamoDB streams] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) и [Amazon Kinesis] (http : //dynamodb-preview.s3-website-us-west-2.amazonaws.com/docs/streams-dg/Streams.KCLAdapter.html). – mkobit

+0

ОК, спасибо. Я добавил поле временной метки для каждой части данных и каждый раз запрашиваю новые данные в Улье. – loopscn

ответ

1

Вы можете создать БИСЫ на столе, а затем запросить таблицу с

по умолчанию это верно, то это даст вам результат в присоединяющемся заказ, если вы хотите его в заказе вы можете пользователь «ScanIndexForward» по убыванию = > ложно,

Например

$response = $this->dbClient->query(array(
      "TableName" => $this->tableName, 
      "IndexName" => "TableNameIndex", 
      "KeyConditions" => array(
       "Id" => array(
        "ComparisonOperator" => ComparisonOperator::EQ, 
        "AttributeValueList" => array(
         array(Type::NUMBER => $this->getId()) 
        ) 
       ) 
      ), 
      "ScanIndexForward" => false, 
     )); 

Вы получите результат в декрементной модели.

если вы хотите топ 50 записей, то вы можете также установить ограничение как

'limit' => Number; 

Надеется, что это поможет.

+0

Будет ли сканирование сохранять какой-то заказ? Кажется, что данные вставляются в разные сегменты, а Scan собирает каждую запись в этих сегментах и ​​выводит на клиент. – loopscn

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