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
相关产品推荐
相关产品推荐

