当数据量过多的时候,往往数据不能全部读取,需要进行分页读取,可以看到到DynamoDB API接口的限制:
BatchGetItem 和 BatchWriteItem API都有数据的限制。
如何进行数据的分页处理呢?
官方文档也提供了详细的文档:
为结果分页
,同时也可以参考
Dynamo DB Pagination
,解释的很到位。
DynamoDB 将对来自 Query/Scan 操作的结果分页。利用分页,Query 结果将分成若干“页”大小为 1 MB(或更小)的数据。应用程序可以先处理第一页结果,然后处理第二页结果,依此类推。
-
检查低级别 Query 结果:
如果结果包含 LastEvaluatedKey 元素,请继续步骤 2。
如果结果中没有 LastEvaluatedKey,则表示没有其他要检索的项目。
-
使用与上一个 Query 请求相同的参数构造新的 Query 请求 — 但此次,请选取步骤 1 中的 LastEvaluatedKey 值并将其用作新的 Query 请求中的 ExclusiveStartKey 参数。
-
运行新的 Query 请求。
-
前往步骤 1。
同时也找到官方提供
aws-doc-sdk-examples
的 Node.js DynamoDB Pagination Demo 。如下:
javascript/example_code/dynamodb/GettingStarted/Node.js/MoviesScan.js
//代码主要Snippets
var params = {
TableName: "Movies",
ProjectionExpression: "#yr, title, info.rating",
FilterExpression: "#yr between :start_yr and :end_yr",
ExpressionAttributeNames: {
"#yr": "year",
ExpressionAttributeValues: {
":start_yr": 1950,
":end_yr": 1959
console.log("Scanning Movies table.");
docClient.scan(params, onScan);
function onScan(err, data) {
if (err) {
console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));
} else {
// print all the movies
console.log("Scan succeeded.");
data.Items.forEach(function(movie) {
console.log(
movie.year + ": ",
movie.title, "- rating:", movie.info.rating);
// continue scanning if we have more movies, because
// scan can retrieve a maximum of 1MB of data
// 检测LastEvaluatedKey字段,判断是否有下一页,采用递归的方式处理。
if (typeof data.LastEvaluatedKey != "undefined") {
console.log("Scanning for more...");
params.ExclusiveStartKey = data.LastEvaluatedKey;
docClient.scan(params, onScan);
当数据量过多的时候,往往数据不能全部读取,需要进行分页读取,可以看到到DynamoDB API接口的限制:BatchGetItemA single operation can retrieve up to 16 MB of data, which can contain as many as 100 items. BatchGetItem will return a partial res...
主表结构(offline-archive.201604)
msgid(主分区键,字符串), msg(字符串), topic(字符串), ts(long型时间戳)
GSI二级索引(topic-ts-index)
项目键(topic)
排序键(ts)
[Server Endpoint][https://docs.aws.amazon.com/zh_cn/general/latest/gr/rande.html] 设置
比如我们的DynamoDb使用的区域是:
这里我们选用的是Amazon DynamoDB用的Endpoint
这里我使用的是dynamodb.us-west-2.amazonaws.com,协议选择的HT...
与 AWS SDK v2 和 v3 兼容
import { DynamoDB } from '@aws-sdk/client-dynamodb' ;
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb' ;
import { getPaginatedResult , decodeCursor } from 'dynamodb-paginator' ;
interface User {
id : string
name : string
const documentClient = DynamoDBDocument . from ( new DynamoDB ( { } ) ) ;
const limit = 25 ;
const standardQueryPar
使用如下分页方式即可。
String selectSql = "SELECT * FROM (SELECT @rowno:=@rowno+1 as rownum,ID,name,sex FROM user,(select @rowno:=0) t) as temp";
page=Db.paginateByFullSql(1, 50, "selec...
在上一篇文章中,我们使用底层Java api在DynamoDB数据库上发出了查询。
使用DynamoDBMapper进行查询非常简单。
使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。
public User getUser(String email) {
User user = dynamoDBMapper.l...
该函数在aws-sdk结果上包装分页执行,从而对结果进行分页。 例如SecretsManager.listSecrets
为每个aws-sdk函数实现分页是一件很痛苦的事情。
实现泛型函数很容易,但可能会变得混乱。
该程序包提供了通用包装器功能,还提供了用于推断结果的类型并为所使用的分页功能输入了参数args,以简化这些功能的用法。
用法的类型推断
如果已经为服务/功能设置了条件类型。 用法很简单:
import { KMS } from "aws-sdk" ;
import { paginate } from "@jurijzahn8019/aws-sdk-paginate-list" ;
const kms = new KMS ( ) ;
const { Keys } = await paginate ( kms ,
DynamoDB简介DynamoDB 是AWS 提供一个 NoSql 数据库服务。它是一个Region级别的服务,针对用户对读写性能的要求进行不同的收费。注意
dynamodb 库中对一些数据类型支持不友好,dynamodb2 中对这些问题进行了完善。
遇到的问题
dyanmo 数据表中数据进行 partial_save 时,产生ConditionCheckFailException 异常,这是由于
Aws之DynamoDb批量读取遇到的坑
最近要写个读取aws大量数据的需求,需要操作多个DynamoDb数据库,这时候沿路就遇到了许多问题
1.从数据库直接扫描读取全部数据
第一步连接数据库
# -*- coding: utf-8 -*-
import boto3
from boto3.dynamodb.conditions import Attr
dynamodb = boto3.resou...
DAX 是一项与 DynamoDB 兼容的缓存服务,可让您受益于针对要求苛刻的应用的极高的内存内性能。DAX 可处理三个核心方案:
作为内存中的缓存,DAX 将最终一致性读取工作量的响应时间缩短了一个数量级 - 从毫秒级缩短到了微秒级。
DAX 通过提供与 Amazon DynamoDB 在 API 上兼容的托管服务降低了运营和应用复杂性,并因此只需...
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.11.534</version>
</dependency...