无法将CSV文件全部数据写入DynamoDB,仅成功写入1537条记录求助
解决CSV导入DynamoDB仅写入1537条记录的问题
看起来你在把S3存储的CSV数据导入DynamoDB时碰到了头疼的问题——只有1537条记录成功写入,剩下的都没进去。结合你给出的代码片段,我整理了几个最可能的原因和对应的解决思路:
1. Lambda执行超时(最常见场景)
如果这段代码是运行在AWS Lambda中,默认的超时时间只有3秒。就算你调整过超时配置,要是CSV文件比较大、单条记录处理耗时久,很可能处理到1537条时Lambda就被强制终止了,剩下的自然没法完成写入。
解决办法:
- 打开Lambda控制台找到你的函数,把超时时间适当调长(比如先设置为5分钟,根据实际文件大小再调整)
- 如果CSV文件特别大,建议改成分段处理:比如把大CSV拆成多个小文件,或者用Lambda异步触发+分页读取的方式,避免一次性加载并处理全部数据
2. DynamoDB批量写入的限制与重试逻辑缺失
要是你用了BatchWriteItem来批量插入数据,得注意DynamoDB的几个硬性规则:
- 单次Batch最多只能处理25条记录
- 预置容量模式下会受读写容量限制,按需模式虽然灵活但也可能遇到短时限流
- 只要Batch里有失败的条目(比如主键冲突、超出容量配额),DynamoDB会返回
UnprocessedItems,如果不重试这些条目,它们就会丢失
解决办法:
- 必须在批量写入逻辑里处理
UnprocessedItems,循环重试直到所有条目都被成功处理 - 可以用AWS SDK的
DynamoDB Enhanced Client来简化批量写入和重试逻辑,它会自动处理未处理条目 - 导入期间如果用的是预置容量模式,临时调高读写容量,或者直接切换到按需模式应对导入峰值
3. CSV读取流未正确处理
你的代码里从S3获取了S3Object,但如果读取流的过程中出现IO异常、或者没读完就提前关闭了流,就会导致只读取到部分行数据,自然也就只写入了对应数量的记录。
解决办法:
- 检查CSV读取代码,确保用
BufferedReader逐行读取时正确判断文件末尾(当readLine()返回null时停止) - 用try-with-resources语法自动管理流资源,避免手动关闭时出现遗漏:
try (InputStream inputStream = s3Object.getObjectContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { String line; // 逐行读取直到文件末尾 while ((line = reader.readLine()) != null) { // 处理单条CSV记录并写入DynamoDB } } catch (IOException e) { // 捕获IO异常并打印日志,不要让程序直接终止 System.err.println("读取S3文件时出错: " + e.getMessage()); }
4. 未捕获的异常导致程序提前终止
你的代码片段只显示了try块,没看到对应的catch处理。如果处理某条记录时抛出了异常(比如数据格式错误、主键字段为空),而你没捕获这些异常,程序会直接崩溃,后面的记录就完全没机会处理了。
解决办法:
- 完善异常处理逻辑:在
try块后添加catch块,捕获可能出现的所有异常(比如DynamoDBException、IllegalArgumentException等),打印详细的错误日志(包括出错的记录内容),然后继续处理下一条记录 - 可以把处理失败的记录单独写入S3的“死信文件”中,后续专门排查这些失败记录的问题
内容的提问来源于stack exchange,提问作者Binay Kumar
相关产品推荐
相关产品推荐

