无法从DynamoDB中检索所有记录

时间:2018-08-31 21:51:29

标签: amazon-web-services amazon-dynamodb

我是AWS工作区的新手,到目前为止,我们正在使用DynamoDB为每个作业执行提供每日日志, 然后每天我们都会根据前一天发布到dynamoDB的所有数据生成一个摘要报告。

在生成摘要报告时从dynamoDB提取数据时遇到问题。为了获取数据,我使用了Java Client inside my scala class。问题是,对于任何过滤条件,我都无法从dynamoDB检索所有数据。但是在检查DynamoDB UI时,我看不到更多记录。

..使用下面的代码..

    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花了一些时间来获取所有过滤条件下的所有数据(当我们扫描数据集时)。从DynamoDB检索所有记录时,Java客户端不会等待。有任何解决方法吗?请帮忙。

谢谢

3 个答案:

答案 0 :(得分:4)

DynamoDB以分页方式返回结果。对于给定的ScanRequestScanResult包含getLastEvaluatedKey,应该通过下一个ScanRequest的{​​{3}}来传递下一页。您应该循环浏览,直到getLastEvaluatedKey中的ScanResult为空为止。

顺便说一句,我同意先前的回答,即从成本的角度来看,DynamoDB可能不是存储此类数据的理想选择,但是您可以更好地判断所做出的选择!

答案 1 :(得分:2)

Dynamodb并非旨在用于您的目的。存储不仅成本更高,而且查询数据也将成本更高。

DynamoDb用于事务键值存储。

您可以将其存储在Firehose,S3中并使用Athena进行查询。这样更便宜,可扩展且适合分析用途。

  

Log-> Firehose-> S3-> Athena

关于您的问题,DynamoDB在您请求时不会返回所有记录。它将返回一组记录并提供lastevaluatedkey。

有关DynamoDB扫描的更多文档。

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

希望有帮助。

答案 2 :(得分:0)

感谢@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
相关问题