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

Lambda读取S3当月Parquet文件合并时遇No objects to concatenate错误求助

解决Lambda中pd.concat报"No objects to concatenate"错误

错误原因分析

这个错误说明你的li列表是空的,没有找到符合条件的Parquet文件,核心问题集中在这几点:

  • S3前缀格式错误:S3对象键没有根目录概念,前缀开头的斜杠/会导致匹配不到实际文件
  • 时间筛选逻辑有漏洞:只匹配月份未匹配年份,且未考虑S3文件的last_modified是UTC时区,和本地时区可能存在差异
  • 未处理空列表情况:直接调用pd.concat会触发报错

修复方案

  1. 修正S3前缀
    把Prefix='/totem/NOB_COD_DIAS/'改为Prefix='totem/NOB_COD_DIAS/',去掉开头的斜杠,确保能正确匹配桶内的文件路径。

  2. 完善时间筛选逻辑

    • 同时匹配年份和月份,避免匹配到历史同月的文件
    • 使用UTC时间对比(datetime.utcnow()),因为S3返回的last_modified是UTC时区的时间,避免时区差异导致的筛选错误
  3. 增加空列表判断
    在执行pd.concat前检查列表是否为空,提前处理避免报错

修改后的完整代码

import boto3
import pandas as pd
from datetime import datetime

S3 = boto3.resource('s3')
bucket = S3.Bucket('cep-dev-bl-mkt')

li = []
# 修正前缀,去掉开头的斜杠
for obj in bucket.objects.filter(Prefix='totem/NOB_COD_DIAS/'):
    if obj.key.endswith('.parquet'):
        # 获取当前UTC时间的年和月
        current_utc = datetime.utcnow()
        # 同时匹配年份和月份,确保是当月文件
        if (obj.last_modified.year == current_utc.year 
            and obj.last_modified.month == current_utc.month):
            df = pd.read_parquet(f's3://{bucket.name}/{obj.key}')
            li.append(df)

# 处理空列表情况
if not li:
    # 可根据业务需求返回空DataFrame或抛出明确异常
    frame = pd.DataFrame()
    # 或者:raise ValueError("未找到当月的Parquet文件")
else:
    frame = pd.concat(li, axis=0, ignore_index=True)

额外排查建议

  • 手动检查S3桶cep-dev-bl-mkt下totem/NOB_COD_DIAS/路径是否存在当月的Parquet文件
  • 确认Lambda执行角色是否拥有S3桶的ListObjects和GetObject权限,确保能正常读取文件
  • 打印obj.key和obj.last_modified日志,验证筛选逻辑是否正确匹配到目标文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:52:05