首页 文章

无法从DynamoDB检索所有记录

提问于
浏览
1

我是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 回答

  • 4

    DynamoDB以分页方式返回结果 . 对于给定的 ScanRequestScanResult 包含getLastEvaluatedKey,应该通过下一个 ScanRequestsetExclusiveStartKey来获取下一页 . 你应该遍历这个,直到 ScanResult 中的 getLastEvaluatedKey 为空 .

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

  • 0

    Dynamodb不适用于您正在使用的目的 . 存储不仅成本更高,而且查询数据也会更昂贵 .

    DynamoDb用于事务密钥值存储 .

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

    日志 - > Firehose - > S3 - >雅典娜

    关于您的问题,当您请求时,DynamoDB不会返回所有记录 . 它将返回一组记录并将给出lastevaluatedkey .

    有关DynamoDB Scan的更多文档 .

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

    希望能帮助到你 .

  • 2

    感谢@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
    

相关问题