从DynamoDB

时间:2018-04-06 01:59:49

标签: amazon-dynamodb delete-operator

我有像这样结构化的DynamoDB表

A   B    C    D
1   id1  foo hi
1   id2  var hello

A是分区键,B是排序键。

让'说我只有分区键,不知道排序键,我想删除所有具有相同分区键的条目。

所以我正在考虑通过查询以固定大小(例如1000)加载条目并批量删除它们,直到DynamoDB中没有剩余分区键的条目。

是否可以删除条目而不先加载它们?

4 个答案:

答案 0 :(得分:4)

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html

DeleteItem

  

按主键删除表格中的单个项目。

     

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

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

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

BatchWriteItem

  

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上找到更多信息