当前位置: 首页 > 知识库问答 >
问题:

Dynamodb-批处理写入不工作(nodejs)

卜盛
2023-03-14

我正在使用lambda、API网关和Dynamodb

我正在创建一个batchWrite函数,在一个函数中上载25个以上的项目

但我发现,当我上传35个项目时,前25个项目成功上传到dynamodb,但最后10个项目失败,但没有记录任何错误

该函数在node.js中编写

'use strict'
const AWS = require('aws-sdk');
const sha1 = require('sha1');
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async function (event, context, callback) {

    let responseBody = "";
    let statusCode = 0;

    const { excelObject } = JSON.parse(event.body);

    if(excelObject){
        await uploadFileByBatch(excelObject)
    }

    const response = {
        statusCode: statusCode,
        headers:{
            "Content-Type": "application/json",
            "access-control-allow-origin": "*"
        },
        body: responseBody
    }

    console.log(response)
    return response
}

let uploadFileByBatch = async function (payload) {

    var items = [];
    var params={};

    if(payload.length > 25){
        console.log("> 25")
        let newObj = payload.slice(0,25)
        payload.splice(0,25)

        console.log("new Payload length")
        console.log(payload.length)

        newObj.forEach(obj =>{
            let hash = sha1(Buffer.from(new Date().toString()+ Math.random()));
            items.push(
                {
                    PutRequest:{
                        Item: {
                            id: obj.id?obj.id:hash,
                            organization_EN: obj.organization_EN,
                            email: obj.email,
                            isActive: obj.isActive
                        }
                    }
                }
            )
        })

        params = {
            RequestItems:{
                "Community": items
            }
        }
        console.log(params)
        try{
            const data = await documentClient.batchWrite(params).promise();
        }catch(err){
            console.log(err)
        }
        uploadFileByBatch(payload)
    }else{
        console.log("less than 25")
        payload.forEach(obj =>{
            let hash = sha1(Buffer.from(new Date().toString()+ Math.random()));
            items.push(
                {
                    PutRequest:{
                        Item: {
                            id: obj.id?obj.id:hash,
                            organization_EN: obj.organization_EN,
                            email: obj.email,
                            isActive: obj.isActive
                        }
                    }
                }
            )
        })
        params = {
            RequestItems:{
                "Community": items
            }
        }
        console.log(params)
        try{
            console.log("first BatchWrite")
            const data = await documentClient.batchWrite(params).promise();
            console.log("first Data")
        }catch(err){
            console.log(err)
        }
    }

}

日志如下所示。

>25
New Payload length
10

{
  RequestItems: {
    'Community': [
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object]
    ]
  }
}

first BatchWrite
Less than 25
{
  RequestItems: {
    'Community': [
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object]
    ]
  }
}

{
  statusCode: 0,
  headers: {
    'Content-Type': 'application/json',
    'access-control-allow-origin': '*'
  },
  body: ''
}

共有1个答案

秦育
2023-03-14

对于DynamoDB的batchWrite函数,您不能在一次请求中上载超过25个

如果以下一项或多项为真,DynamoDB将拒绝整个批处理写入操作:

  • BatchWriteItem请求中指定的一个或多个表不存在

您可以在此处检索有关此的信息https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

有很多方法可以处理大批量操作,您可以执行25个并行请求,但您应该小心。

 类似资料:
  • 我正在使用hibernate jpa执行批处理更新。 更新:我得到了解决方案:问题是我正在刷新已经刷新的事务,因此它没有给我任何事务正在进行中的错误以及我上面发布的错误,所以我只是删除了`getem().flush();和getEm().clear();从finally块开始工作:)

  • 我试图使用batchWrite将一个数据插入Dynamodb,但它无法插入数据。它只显示此消息(但没有错误消息)。 然后,无法插入数据。我试着用put,效果很好。我用的是Lambda。这是代码。

  • 知道为什么下面的代码会出现以下错误吗? java.lang.NullPointerException:org.springframework.batch.item.database.HibernateCursoritemReader.DoRead处为null(HibernateCursoritemReader.java:155)

  • 我知道ConcurrentKafkaListenerContainerFactory具有属性“setBatchListener(true)”,但就我对Kafka文档的理解而言,这种类型的工厂配置仅与@KafKalistener注释一起使用。 任何帮助都将不胜感激。

  • 我需要在我的MySQL数据库中进行批量插入(近10000个)。我正在使用JPA/Hibernate和spring Boot。我从hibernate文档中读到了在hibernate中执行大容量插入/更新,我认为我的代码不能正常工作,因为它顺序地插入hibernate查询,而不是在批处理插入中执行它们。下面是我的代码。我是不是漏掉了什么? 这是我的数据源配置。 我是不是漏掉了什么? 请帮帮忙。

  • 我想从mysql读取数据,然后写入sftp。现在我将文件写入本地,从本地写入sftp,最好的方法是什么?