Amazon dynamodb 从DynamoDB中删除具有相同分区密钥的大数据

Amazon dynamodb 从DynamoDB中删除具有相同分区密钥的大数据,amazon-dynamodb,delete-operator,Amazon Dynamodb,Delete Operator,我的DynamoDB表的结构如下 A B C D 1 id1 foo hi 1 id2 var hello A是分区键,B是排序键 假设我只有分区键,不知道排序键,我想删除所有具有相同分区键的条目 因此,我考虑通过查询加载具有固定大小(例如1000)的条目,并在批处理中删除它们,直到DynamoDB中不再有带分区键的条目 是否可以在不先加载的情况下删除条目? 删除项 按主键删除表中的单个项 对于主键,必须提供所有属性。对于 例如,对于一个简单的主键,您只需要提供一个

我的DynamoDB表的结构如下

A   B    C    D
1   id1  foo hi
1   id2  var hello
A
是分区键,
B
是排序键

假设我只有分区键,不知道排序键,我想删除所有具有相同分区键的条目

因此,我考虑通过查询加载具有固定大小(例如1000)的条目,并在批处理中删除它们,直到DynamoDB中不再有带分区键的条目

是否可以在不先加载的情况下删除条目?

删除项 按主键删除表中的单个项

对于主键,必须提供所有属性。对于 例如,对于一个简单的主键,您只需要提供一个值 对于分区键。对于复合主键,必须提供 分区键和排序键的值

为了删除一个项目,您必须提供整个主键(分区+排序键)。因此,在您的情况下,您需要查询分区键,获取所有主键,然后使用这些主键删除每个项。也可以使用BatchWriteItem

批写入项 BatchWriteItem操作在一个或多个文件中放置或删除多个项目 更多的桌子。对BatchWriteItem的单个调用最多可以写入16 MB的数据 数据,可包含多达25个put或delete请求。 要写入的单个项可以大到400 KB

DeleteRequest-对指定项执行DeleteItem操作。要删除的项由关键字子元素标识:Key- 唯一标识项的主键属性值的映射。 此映射中的每个条目都由一个属性名称和一个属性组成 价值对于每个主键,必须提供所有主键 属性。例如,对于一个简单的主键,您只需要 为分区键提供一个值对于复合主键, 必须同时提供分区键和排序键的值

您可以在范围键上使用“开始”

例如(伪代码)


对于生产数据库和关键的AmazonDynamodB表,建议使用批写入项来清除大量数据

批写入项(使用DeleteRequest)比删除项快10到15倍

aws dynamodb scan --table-name "test_table_name" --projection-expression "primary_key, timestamp" --filter-expression "timestamp < :oldest_date" --expression-attribute-values '{":oldest_date":{"S":"2020-02-01"}}' --max-items 25 --total-segments "$TOTAL_SEGMENT" --segment "$SEGMENT_NUMBER" > $SCAN_OUTPUT_FILE

cat $SCAN_OUTPUT_FILE | jq -r ".Items[] | tojson" | awk '{ print "{\"DeleteRequest\": {\"Key\": " $0 " }}," }' | sed '$ s/.$//' | sed '1 i { "test_table_name": [' | sed '$ a ] }' > $INPUT_FILE

aws dynamodb batch-write-item --request-items file://$INPUT_FILE
aws dynamodb扫描--表名“test_table_name”--投影表达式“primary_key,timestamp”--过滤表达式“timestamp<:oldest_date”--表达式属性值“{”:oldest_date”:“{”S“:“2020-02-01”}}}”--最大项25--总段“$total_SEGMENT”--段“$SEGMENT_NUMBER”>$scan_输出文件
cat$SCAN_OUTPUT_FILE | jq-r“.Items[]| tojson”| awk'{print'{\'DeleteRequest\':{\'Key\':“$0”},“}'| sed'$s/$/'| sed'1i{“test u table_name”:[''sed'$a]}>$INPUT_FILE
aws dynamodb批写入项--请求项文件://$INPUT\U文件

请查找更多信息@

否,但您可以查询分区的所有项目,然后为每个项目发出单独的DeleteRequest,您可以在最多25个项目的多个BatchWrite调用中批处理这些项目

JS代码

异步函数deleteItems(tableName,partitionId){
常量查询参数={
TableName:TableName,
KeyConditionExpression:'partitionId=:partitionId',
expressionAttributeValue:{:partitionId:partitionId},
};
const queryResults=await docClient.query(queryParams.promise())
if(queryResults.Items&&queryResults.Items.length>0){
const batchCalls=块(queryResults.Items,25).map(异步(块)=>{
const deleteRequests=chunk.map(项=>{
返回{
删除请求:{
关键:{
“partitionId”:item.partitionId,
'sortId':item.sortId,
}
}
}
})
常量batchWriteParams={
请求项目:{
[表名]:删除请求
}
}
等待docClient.batchWrite(batchwritepams.promise())
})
等待承诺。全部(批处理呼叫)
}
}
// https://stackoverflow.com/a/37826698/3221253
函数块(inputArray、perChunk){
返回inputArray.reduce((all,one,i)=>{
常数ch=数学楼层(i/Percunk);
全部[ch]=[].concat((全部[ch]|【】),一个);
全部归还
}, [])
}

同样的问题和一个代码示例是否有一种方法可以删除只有散列键(没有范围键)的项目?否。这肯定是缺少的功能。希望在将来。所以答案是否定的。对于复合主键-没有办法删除只有散列(分区)的项key@codereviewanskquestions这个问题通常是通过在range键上执行一个
begins=“id”
来设计的,因为问题是关于不使用SQL的DynamoDB。使用SQL在这里根本不适用。
aws dynamodb scan --table-name "test_table_name" --projection-expression "primary_key, timestamp" --filter-expression "timestamp < :oldest_date" --expression-attribute-values '{":oldest_date":{"S":"2020-02-01"}}' --max-items 25 --total-segments "$TOTAL_SEGMENT" --segment "$SEGMENT_NUMBER" > $SCAN_OUTPUT_FILE

cat $SCAN_OUTPUT_FILE | jq -r ".Items[] | tojson" | awk '{ print "{\"DeleteRequest\": {\"Key\": " $0 " }}," }' | sed '$ s/.$//' | sed '1 i { "test_table_name": [' | sed '$ a ] }' > $INPUT_FILE

aws dynamodb batch-write-item --request-items file://$INPUT_FILE