基于dbt-duckdb读取Parquet文件报错求助(本地/S3场景)
解决dbt-duckdb连接Parquet文件时的IO Error问题
问题描述
尝试用dbt-duckdb构建以Parquet为数据源的dbt pipeline,目标读取S3桶中的文件,测试本地运行时执行dbt debug报错:
IO Error: The file ".../sources/energy.parquet" exists, but it is not a valid DuckDB database file!
错误原因
profiles.yml中的path参数是用来指定DuckDB数据库文件的路径(可本地文件或内存数据库),而非Parquet文件路径。你把Parquet文件路径填在这里,导致dbt误将其当作DuckDB数据库文件尝试打开,触发错误。
解决方案
1. 修正profiles.yml配置
将path改为DuckDB数据库文件路径(比如本地文件./duckdb.db,或内存数据库:memory:),保留扩展和S3配置:
transform_dbt: outputs: dev: type: duckdb path: ./duckdb.db # 替换为DuckDB数据库路径,用:memory:则为内存模式 extensions: - httpfs - parquet settings: s3_region: my-aws-region s3_access_key_id: "{{ env_var('S3_ACCESS_KEY_ID') }}" s3_secret_access_key: "{{ env_var('S3_SECRET_ACCESS_KEY') }}" target: dev
2. 修正sources.yml配置
DuckDB读取Parquet无需指定Parquet的"schema",直接在identifier中填写Parquet文件路径即可:
本地Parquet文件示例
version: 2 sources: - name: local_sources tables: - name: energy identifier: './sources/energy.parquet'
S3上的Parquet文件示例
version: 2 sources: - name: s3_sources tables: - name: energy identifier: 's3://bucket/energy.parquet'
补充说明
- 使用
:memory:作为path时,每次运行dbt都会重新加载Parquet数据,适合快速测试;使用本地db文件会缓存数据,后续运行速度更快。 - dbt-duckdb会自动加载
httpfs和parquet扩展,确保这两个扩展已正确安装(通常dbt-duckdb会自带)。
内容的提问来源于stack exchange,提问作者david backx
相关产品推荐
相关产品推荐

