AWS S3 批量获取多个json.gz文件并合并内容的实现方法
AWS S3批量获取gzip压缩文件并合并内容实现方案
首先需要先修复原单文件读取函数的问题:原函数定义了key和bucket参数但实际硬编码了配置,且Promise回调不需要额外加async标识,修复后的单文件读取函数如下:
const zlib = require('zlib'); const AWS = require('aws-sdk'); // 初始化配置只需要执行一次,不用放到每次请求里 AWS.config.loadFromPath(process.env["PWD"]+'/private/awss3/s3_config.json'); const s3 = new AWS.S3(); const unzipFromS3 = (key, bucket) => { return new Promise((resolve, reject) => { const options = { Bucket: bucket, Key: key, }; s3.getObject(options, function(err, res) { if(err) return reject(err); resolve(zlib.unzipSync(res.Body).toString()); }); }); };
接下来实现批量读取+合并逻辑,用Promise.all并行拉取所有目标文件,全部返回后按业务需求合并内容即可,示例代码如下:
// 配置你的目标桶和文件列表 const TARGET_BUCKET = 'my-bucket'; const FILE_KEY_LIST = [ 'mainfile1.json.gz', 'mainfile2.json.gz', 'mainfile3.json.gz' ]; // 批量读取合并入口 const mergeS3Files = async () => { try { // 并行拉取所有文件内容 const fileContentList = await Promise.all( FILE_KEY_LIST.map(key => unzipFromS3(key, TARGET_BUCKET)) ); // 按需选择合并逻辑,以下是3种常见场景: let mergedResult; // 场景1:纯文本内容直接拼接 mergedResult = fileContentList.join(''); // 场景2:每个文件是独立JSON数组,合并为一个大数组 // mergedResult = []; // fileContentList.forEach(content => { // const jsonArr = JSON.parse(content); // mergedResult = mergedResult.concat(jsonArr); // }); // mergedResult = JSON.stringify(mergedResult); // 如果需要输出为JSON字符串可以加这一步 // 场景3:每个文件是NDJSON格式(每行一个JSON对象),合并为对象数组 // mergedResult = []; // fileContentList.forEach(content => { // const lineList = content.trim().split('\n'); // lineList.forEach(line => mergedResult.push(JSON.parse(line))); // }); console.log('合并完成,结果长度:', mergedResult.length); return mergedResult; } catch (err) { console.error('批量处理失败:', err); throw err; } }; // 执行调用 mergeS3Files().then(result => { // 后续处理合并后的结果 console.dir(result); });
注意:如果你的文件数量非常多,建议控制并发数避免触发S3的请求频率限制,可以用并发控制工具做请求限流,避免请求失败。
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

