【问题标题】:Unable to retrieve all the records from DynamoDB无法从 DynamoDB 检索所有记录
【发布时间】:2018-09-01 15:58:13
【问题描述】:

我是 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 客户端不会等待。是否有任何解决方法。请帮忙。

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      DynamoDb 用于交易键值存储。

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

      日志 --> Firehose --> S3 --> Athena

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

      有关 DynamoDB 扫描的更多文档。

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

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-09
          • 1970-01-01
          • 2013-08-22
          • 1970-01-01
          • 1970-01-01
          • 2018-10-02
          相关资源
          最近更新 更多