我是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客户端不会等待。有任何解决方法吗?请帮忙。
谢谢
答案 0 :(得分:4)
DynamoDB以分页方式返回结果。对于给定的ScanRequest
,ScanResult
包含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