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

Jupyter中使用DuckDB查询S3存储的Parquet文件报错如何解决?

问题原因

pandas 读取 S3 Parquet 时默认依赖 s3fs 库,会自动读取 AWS 默认凭据链(本地配置文件、环境变量、云服务实例的 IAM 角色等)完成鉴权,因此可以正常访问。而 DuckDB 的 S3 访问能力依赖独立的 httpfs 扩展,默认未开启,未加载该扩展时DuckDB无法识别s3://协议,会将路径视为本地文件路径,因此抛出找不到文件的错误,同时DuckDB默认也不会自动读取本地AWS配置,需要手动开启或配置鉴权信息。

修复步骤
  • 第一步:在 DuckDB 会话中先安装并加载 httpfs 扩展,这是访问远程文件的前提,你的原有代码缺失该步骤
  • 第二步:确认 S3 区域、密钥配置和路径完全正确,若使用阿里云 OSS、MinIO 等兼容 S3 的存储,还需要额外配置 s3_endpoint 与 s3_use_ssl 参数
  • 第三步:若使用新版本 DuckDB(0.8.0及以上),可开启自动凭据加载,无需手动填写密钥,会自动复用 AWS 本地配置与运行时角色
修复后可运行代码
import boto3
import duckdb
import pandas as pd

con = duckdb.connect(database=':memory:', read_only=False)
# 加载S3依赖扩展
con.execute("""
INSTALL httpfs;
LOAD httpfs;
-- 以下配置如果开启自动凭据可以省略
SET s3_region='你的实际S3区域';
SET s3_access_key_id='你的AccessKey';
SET s3_secret_access_key='你的SecretKey';
-- 可选:开启自动凭据加载,自动读取本地AWS配置、环境变量、IAM角色
-- SET s3_use_credential_provider='chain';
""")

# 直接查询S3 Parquet
out = con.execute(f"select * from parquet_scan('s3://<bucket>/<file>.parquet') limit 10;").fetchall()

# 结合pandas read_sql使用示例
df = pd.read_sql("select * from parquet_scan('s3://<bucket>/<file>.parquet') limit 10;", con)
常见排查点

如果配置扩展后依然报错,优先检查以下内容:

  • S3 路径的 Bucket 名称、文件路径完全正确,无多余空格或拼写错误
  • 配置的密钥对有对应 Bucket 的 s3:GetObject 权限
  • 若文件是分区存储的 Parquet 目录,可改用 read_parquet 函数替代 parquet_scan,支持自动遍历分区

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:06