我有像这样结构化的DynamoDB表
A B C D
1 id1 foo hi
1 id2 var hello
A
是分区键,B
是排序键。
让'说我只有分区键,不知道排序键,我想删除所有具有相同分区键的条目。
所以我正在考虑通过查询以固定大小(例如1000)加载条目并批量删除它们,直到DynamoDB中没有剩余分区键的条目。
是否可以删除条目而不先加载它们?
答案 0 :(得分:4)
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html
按主键删除表格中的单个项目。
对于主键,您必须提供所有属性。对于 例如,使用简单的主键,您只需提供一个值 对于分区键。对于复合主键,您必须提供 分区键和排序键的值。
要删除项目,您必须提供整个主键(分区+排序键)。因此,在您的情况下,您需要查询分区键,获取所有主键,然后使用它们删除每个项目。您也可以使用BatchWriteItem
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html
BatchWriteItem操作在一个或多个项目中放入或删除多个项目 更多表格。对BatchWriteItem的单次调用最多可以写入16 MB 数据,可包含多达25个放置或删除请求。 要写入的单个项目可以大到400 KB。
DeleteRequest - 对指定的项目执行DeleteItem操作。要删除的项目由Key子元素标识:Key - 唯一标识项目的主键属性值的映射。 此映射中的每个条目都包含属性名称和属性 值。对于每个主键,您必须提供所有密钥 属性。例如,使用简单的主键,您只需要 提供分区键的值。 对于复合主键, 您必须为分区键和排序键提供值。
答案 1 :(得分:1)
否,但是您可以查询该分区的所有项目,然后为每个项目发出单独的DeleteRequest,可以批量调用多达25个项目的多个BatchWrite调用。
JS代码
async function deleteItems(tableName, partitionId ) {
const queryParams = {
TableName: tableName,
KeyConditionExpression: 'partitionId = :partitionId',
ExpressionAttributeValues: { ':partitionId': partitionId } ,
};
const queryResults = await docClient.query(queryParams).promise()
if (queryResults.Items && queryResults.Items.length > 0) {
const batchCalls = chunks(queryResults.Items, 25).map( async (chunk) => {
const deleteRequests = chunk.map( item => {
return {
DeleteRequest : {
Key : {
'partitionId' : item.partitionId,
'sortId' : item.sortId,
}
}
}
})
const batchWriteParams = {
RequestItems : {
[tableName] : deleteRequests
}
}
await docClient.batchWrite(batchWriteParams).promise()
})
await Promise.all(batchCalls)
}
}
// https://stackoverflow.com/a/37826698/3221253
function chunks(inputArray, perChunk) {
return inputArray.reduce((all,one,i) => {
const ch = Math.floor(i/perChunk);
all[ch] = [].concat((all[ch]||[]),one);
return all
}, [])
}
答案 2 :(得分:0)
您可以在范围键上使用“ begins_with”。
例如(伪代码)
DELETE WHERE A = '1' AND B BEGINS_WITH 'id'
答案 3 :(得分:0)
对于生产数据库和关键的Amazon DynamoDB表,建议使用批处理写入项清除大量数据。
批处理写入项目(带有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
请在https://medium.com/analytics-vidhya/how-to-delete-huge-data-from-dynamodb-table-f3be586c011c上找到更多信息