Lambda读取S3当月Parquet文件合并时遇No objects to concatenate错误求助
解决Lambda中pd.concat报"No objects to concatenate"错误
错误原因分析
这个错误说明你的li列表是空的,没有找到符合条件的Parquet文件,核心问题集中在这几点:
- S3前缀格式错误:S3对象键没有根目录概念,前缀开头的斜杠
/会导致匹配不到实际文件 - 时间筛选逻辑有漏洞:只匹配月份未匹配年份,且未考虑S3文件的
last_modified是UTC时区,和本地时区可能存在差异 - 未处理空列表情况:直接调用
pd.concat会触发报错
修复方案
修正S3前缀
把Prefix='/totem/NOB_COD_DIAS/'改为Prefix='totem/NOB_COD_DIAS/',去掉开头的斜杠,确保能正确匹配桶内的文件路径。完善时间筛选逻辑
- 同时匹配年份和月份,避免匹配到历史同月的文件
- 使用UTC时间对比(
datetime.utcnow()),因为S3返回的last_modified是UTC时区的时间,避免时区差异导致的筛选错误
增加空列表判断
在执行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
相关产品推荐
相关产品推荐

