Невозможно получить все записи из DynamoDB - PullRequest
0 голосов
/ 01 сентября 2018

Я новичок в рабочей области AWS, на данный момент мы используем DynamoDB для ежедневной подачи наших журналов для каждого выполнения задания, И затем каждый день мы генерируем сводный отчет по всем данным, которые были опубликованы на DynamoDB в предыдущий день.

У меня возникла проблема при получении данных из DynamoDB при создании сводного отчета. Для получения данных я использую Java Client inside my scala class. Проблема в том, что я не могу получить все данные из DynamoDB для любого условия фильтра. Но во время проверки в интерфейсе DynamoDB я вижу гораздо больше записей.

.. используя приведенный ниже код ..

    val client: AmazonDynamoDB = AmazonDynamoDBClientBuilder.standard.build

//Function that returns filter expression and ExpressionAttribute
    val (filterExpression, expressionAttributeValues) = getDynamoDBQuery(inputArgs)

    val scanRequest: ScanRequest = new ScanRequest()
      .withTableName("table_name")
      .withFilterExpression(filterExpression)
      .withExpressionAttributeValues(expressionAttributeValues)

    client.scan(scanRequest)

После большого анализа кажется, что DynamoDB требуется некоторое время для извлечения всех данных для любого условия фильтра (когда мы сканируем набор данных). И Java-клиент не ждет, пока все записи будут получены из DynamoDB. Есть ли обходной путь для этого. Пожалуйста, помогите.

Спасибо

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

DynamoDB возвращает результаты в разбивке по страницам. Для данного ScanRequest, ScanResult содержит getLastEvaluatedKey , который должен быть пропущен через setExclusiveStartKey следующего ScanRequest, чтобы получить следующую страницу. Вы должны проходить через это, пока getLastEvaluatedKey в ScanResult не станет нулевым.

Кстати, я согласен с предыдущим ответом, что DynamoDB не может быть идеальным выбором для хранения такого рода данных с точки зрения затрат, но вы лучше судите о сделанном выборе!

0 голосов
/ 01 сентября 2018

Спасибо @Vikdor за вашу помощь .. Я сделал то же самое, что вы предложили, и все работало отлично. Ниже приведен код ..

var output = new StringBuilder
val client: AmazonDynamoDB = AmazonDynamoDBClientBuilder.standard.build

val (filterExpression, expressionAttributeValues) = getDynamoDBQuery(inputArgs)

var scanRequest: ScanRequest = new ScanRequest()
  .withTableName("watchman-jobs")
  .withFilterExpression(filterExpression)
  .withExpressionAttributeValues(expressionAttributeValues)

var flag: Boolean = false
var scanResult = client.scan(scanRequest)
var items : util.List[util.Map[String,AttributeValue]] = scanResult.getItems
var lastEvaluatedKey: util.Map[String, AttributeValue] = null
do {
  scanRequest = scanRequest.withExclusiveStartKey(lastEvaluatedKey)
  scanResult = client.scan(scanRequest)
  if(flag) items.addAll(scanResult.getItems)
  lastEvaluatedKey = scanResult.getLastEvaluatedKey
  flag = true
} while ( {
  lastEvaluatedKey != null
})

return items
0 голосов
/ 01 сентября 2018

Dynamodb не предназначен для целей, для которых вы используете. Хранение не только дороже, но и запрос данных также будет дороже.

DynamoDb предназначен для хранения значения ключа транзакции.

Вы можете сохранить его в Firehose, S3 и запросить у Athena. Это дешевле, масштабируемо и хорошо для аналитического использования.

Журнал -> Пожарный шланг -> S3 -> Афина

Что касается вашего вопроса, DynamoDB не вернет все записи, когда вы запросите его. Он вернет набор записей и выдаст ключ lastevaluated.

Дополнительная документация по сканированию DynamoDB.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...