【问题标题】:How to write 5000 records into DynamoDB Table?如何将 5000 条记录写入 DynamoDB 表?
【发布时间】:2020-07-01 07:14:42
【问题描述】:

我有一个用例,我必须一次性将 5000 条记录写入 dynamoDB 表。我正在使用 DynamoDBMapper 库的 batchSave api。它可以一次写入多达 25 条记录。 我可以将 5000 条记录的列表传递给它,它会在内部将它们转换为 25 条记录的批次并写入 dynamodb 表,或者我将不得不在我的代码中使用有条件的一些逻辑来处理这个东西,并且只会将 25 条记录传递给 batchSave?

【问题讨论】:

标签: amazon-dynamodb dynamo-local


【解决方案1】:

根据batchSave documentation,batchSave():

保存使用一次或多次调用 AmazonDynamoDB.batchWriteItem 给出的对象

实际上,它会将您提供给它的项目拆分成适当大小的批次(25 个项目),并使用 DynamoDB BatchWriteItem 操作将它们写入。

您可以在batchWrite() 中的DynamoDBMapper.java 中看到执行此操作的代码:

    /** The max number of items allowed in a BatchWrite request */
    static final int MAX_ITEMS_PER_BATCH = 25;

    // Break into chunks of 25 items and make service requests to DynamoDB
    for (final StringListMap<WriteRequest> batch :
               requestItems.subMaps(MAX_ITEMS_PER_BATCH, true)) {
        List<FailedBatch> failedBatches = writeOneBatch(batch, config.getBatchWriteRetryStrategy());
        ...

【讨论】:

  • 我不必处理这个,API 会为我做吗?
  • 是的,它应该(图书馆的 API,而不是亚马逊的基于 HTTP 的 API)。
【解决方案2】:

以下是我为了达到这个目的而使用的方法。我设法做到了,首先将 dataArray 放入小数组(长度为 25):

const queryChunk = (arr, size) => {
    const tempArr = []
    for (let i = 0, len = arr.length; i < len; i += size) {
        tempArr.push(arr.slice(i, i + size));
    }

    return tempArr
}

const batchWriteManyItems = async (tableName, itemObjs, chunkSize = 25) => {
    return await Promise.all(queryChunk(itemObjs, chunkSize).map(async chunk => {
        await dynamoDB.batchWriteItem({RequestItems: {[tableName]: chunk}}).promise()
    }))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多