Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 使用fast csv将s3流到dynamodb:未插入所有数据_Amazon S3_Aws Lambda_Stream_Amazon Dynamodb_Fast Csv - Fatal编程技术网

Amazon s3 使用fast csv将s3流到dynamodb:未插入所有数据

Amazon s3 使用fast csv将s3流到dynamodb:未插入所有数据,amazon-s3,aws-lambda,stream,amazon-dynamodb,fast-csv,Amazon S3,Aws Lambda,Stream,Amazon Dynamodb,Fast Csv,当csv文件上载到我的s3存储桶时,我的lambda将被触发,以将我的数据插入DynamoDB。 我需要一个流,因为文件太大,无法作为完整对象下载 const batchWrite=async(clientDynamoDB,itemsToProcess)=>{ 常数ri={}; ri[TABLE_DYNAMO]=itemsToProcess.map((itm)=>toPutRequest(itm)); const params={RequestItems:ri}; wait clientDyna

当csv文件上载到我的s3存储桶时,我的lambda将被触发,以将我的数据插入DynamoDB。 我需要一个流,因为文件太大,无法作为完整对象下载

const batchWrite=async(clientDynamoDB,itemsToProcess)=>{
常数ri={};
ri[TABLE_DYNAMO]=itemsToProcess.map((itm)=>toPutRequest(itm));
const params={RequestItems:ri};
wait clientDynamoDB.batchWriteItem(params.promise();
};
函数runStreamPromiseAsync(stream,clientDynamoDB){
返回新承诺((解决、拒绝)=>{
常数sizeChunk=25;
让itemsToProcess=[];
流动
.pipe(fastCsv.parse({headers:Object.keys(schemaGeData),trim:true}))
.on(“数据”,(行)=>{
stream.pause();
itemsToProcess.push(行);
if(itemsToProcess.length==sizeChunk){
batchWrite(clientDynamoDB,ItemStopProcess)。最后(()=>{
stream.resume();
});
ItemStopProcess=[];
}
})
.on(“错误”,(错误)=>{
控制台日志(err);
拒绝(“错误”);
})
.on(“结束”,()=>{
stream.pause();
控制台日志(“结束”);
batchWrite(clientDynamoDB,ItemStopProcess)。最后(()=>{
决议(“确定”);
});
});
});
}
module.exports.main=异步(事件、上下文、回调)=>{
context.callbackhaitsforemptyeventloop=false;
const AWS=require('AWS-sdk');
const s3=新的AWS.s3();
const object=event.Records[0].s3;
const bucket=object.bucket.name;
const file=object.object.key;
const agent=new https.agent({
keepAlive:是的
});
const client=new AWS.DynamoDB({
httpOptions:{
代理人
}
});
试一试{
//获取流csv数据
常数流=s3
.getObject({
桶:桶,
关键字:文件
})
.createReadStream()文件
.on('错误',(e)=>{
控制台日志(e);
});
等待runStreamPromiseAsync(流、客户端);
}捕获(e){
控制台日志(e);
}
};
当我的文件是1000行时,所有内容都被插入,但当我有5000行时,我的函数只插入3000行左右,这个数字是随机的。。。有时多,有时少

所以我想知道我在这里错过了什么

我也读过这篇文章,但老实说,即使你暂停第二条流,第一条流仍然在运行。。因此,如果有人对如何做到这一点有任何想法,将不胜感激


谢谢

我找到了它没有被完全处理的原因,因为
batchWriteItem
的回调可以返回未处理的项目。因此,我稍微更改了函数
batchWrite
runpromisestreaasync
,因为我可能没有从
itemsToProcess
处理所有项目

无论如何,以下是完整的代码:

const batchWrite=(客户端,itemsToProcess)=>{
常数ri={};
ri[TABLE_DYNAMO]=itemsToProcess.map((itm)=>toPutRequest(itm));
const items={RequestItems:ri};
const processItemsCallback=函数(错误,数据){
返回新承诺((解决、拒绝)=>{
如果(!data | | data.length==0){
返回resolve();
}
如果(错误){
退货拒绝(err);
}
设params={};
params.RequestItems=data.UnprocessedItems;
返回client.batchWriteItem(参数,processItemsCallback);
});
};
返回client.batchWriteItem(items,ProcessItemsCalback);
};
函数runStreamPromiseAsync(stream,clientDynamoDB){
返回新承诺((解决、拒绝)=>{
常数sizeChunk=25;
让itemsToProcess=[];
让arrayPromise=[];
流动
.pipe(fastCsv.parse({headers:Object.keys(schemaGeData),trim:true}))
.on(“错误”,(错误)=>{
控制台日志(err);
拒绝(“错误”);
})
.on('data',data=>{
itemsToProcess.push(数据);
if(itemsToProcess.length==sizeChunk){
arrayPromise.push(batchWrite(clientDynamoDB,itemsToProcess));
ItemStopProcess=[];
}
})
.on('end',()=>{
if(itemsToProcess.length!==0){
arrayPromise.push(batchWrite(clientDynamoDB,itemsToProcess));
}
解析(Promise.all(arrayPromise).catch(e=>{
拒绝(e)
}));
});
});
}