You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Lambda中将S3中的AVRO文件转换为JSON格式?

读取S3中AVRO文件并转换为记录数组的解决方案
  • 第一步:安装AVRO解析依赖
    Lambda环境需要用到avsc库解析AVRO文件,你可以在本地项目执行npm install avsc,之后把依赖和Lambda代码一起打包部署,或者用Lambda层统一管理依赖。

  • 第二步:完整实现代码
    下面是可直接运行的代码,核心是把S3返回的流转成Buffer,再用avsc解析成记录数组:

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { createDecoder } from 'avsc';

const client = new S3Client({});

export const handler = async (event) => {
  // 从S3触发事件中提取桶名和文件键
  const s3Record = event.Records[0].s3;
  const parameters = {
    Bucket: s3Record.bucket.name,
    Key: s3Record.object.key
  };

  try {
    const { Body } = await client.send(new GetObjectCommand(parameters));
    
    // 将S3返回的可读流转换为Buffer
    const buffer = await streamToBuffer(Body);
    
    // 解析AVRO文件并收集所有记录
    const decoder = createDecoder(buffer);
    const records = [];
    let currentRecord;
    while ((currentRecord = decoder.decode()) !== null) {
      records.push(currentRecord);
    }

    // 此处可对records数组做后续处理
    console.log(`解析到${records.length}条记录`, records);
    return { statusCode: 200, body: JSON.stringify({ recordCount: records.length }) };
  } catch (err) {
    console.error('处理AVRO文件失败:', err);
    return { statusCode: 500, body: JSON.stringify({ error: err.message }) };
  }
};

// 辅助函数:将可读流转换为Buffer
function streamToBuffer(stream) {
  return new Promise((resolve, reject) => {
    const chunks = [];
    stream.on('data', chunk => chunks.push(chunk));
    stream.on('end', () => resolve(Buffer.concat(chunks)));
    stream.on('error', reject);
  });
}
  • 第三步:关键注意事项
    • 若AVRO文件体积过大(超出Lambda内存限制),不要一次性转成Buffer,改用流式解析:
      const decoder = createDecoder({ stream: Body });
      // 后续循环解码逻辑不变
      
    • 确保Lambda执行角色拥有s3:GetObject权限,避免权限报错。
    • 打包部署时,务必将avsc依赖包含在内,或通过Lambda层关联到函数。

内容的提问来源于stack exchange,提问作者Haumea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:36:29