使用DuckDB读取SMB存储的Delta表时触发DeltaKernel FFI错误
在同一机器的同一Python内核中,用Polars将Delta表写入SMB网络驱动器后,使用DuckDB执行SQL查询时触发FFI错误,提示无法识别file://xxx.xxx.x.xxx/airflow/data/prices_delta/格式的URL。尝试过相对路径与绝对路径,相对路径可正常用于DuckDB扫描CSV/Parquet等操作,但查询Delta表时失效。
用户执行的代码如下:
delta_data_folder = '..\\..\\data\\prices_delta' Query = f""" SELECT count(*) FROM delta_scan('{delta_data_folder}') WHERE 1=1 AND year = 2024 AND month = 8 AND day = 29 """ con = duckdb.connect(database = ":memory:") con.execute(Query).df().head()
触发的错误信息:
IOException: IO错误:触发DeltaKernel FFI错误(来源:尝试读取Delta表时: '....\data\prices_delta/'):遇到错误:8(ObjectStoreError),消息为(与对象存储交互出错:通用URL错误:无法识别URL "file://xxx.xxx.x.xxx/airflow/data/prices_delta/")
解决方案
直接使用SMB原生路径
DuckDB的Delta插件处理SMB路径时,可能无法正确解析自动转换的file://格式,改用SMB原生路径(双反斜杠开头),同时用原始字符串避免转义问题:delta_data_folder = r'\\xxx.xxx.x.xxx\airflow\data\prices_delta'将SMB共享挂载为本地盘符
把目标SMB共享目录挂载成本地盘符(比如Z:),之后用本地盘符路径访问,让DuckDB像处理本地文件一样读取Delta表:delta_data_folder = r'Z:\airflow\data\prices_delta'升级相关依赖版本
旧版DuckDB或Delta插件对SMB路径支持可能存在缺陷,升级到最新版本:pip install --upgrade duckdb delta-kernel强制指定本地文件系统
在delta_scan中通过file_system参数显式指定使用本地文件系统,避免插件将路径解析为远程URL:Query = f""" SELECT count(*) FROM delta_scan('{delta_data_folder}', file_system='local') WHERE 1=1 AND year = 2024 AND month = 8 AND day = 29 """
内容的提问来源于stack exchange,提问作者krewsayder

