使用DuckDB和Python读取GCP存储桶中多个Parquet文件时Glob模式失效的解决方法问询
DuckDB和Python读取GCP存储桶中多个Parquet文件时Glob模式失效的解决方法问询
- Python版本:Python 3.12.3
- DuckDB版本:"1.1.3"
我现在正尝试用DuckDB读取GCP存储桶目录里的多个Parquet文件,想用Glob模式匹配文件,但遇到了麻烦。
我可以成功加载单个Parquet文件,代码如下:
# 可行 duckdb.register_filesystem(filesystem("gcs")) test_file = "gcs:///some_bucket/some_dir/some_file.parquet" data = duckdb.sql(f"SELECT * FROM read_parquet('{test_file}')")
根据DuckDB多文件读取的相关说明,我以为用Glob模式的代码也能正常运行,但实际却失败了:
# 失败 duckdb.register_filesystem(filesystem("gcs")) test_file = "gcs:///some_bucket/some_dir/*.parquet" data = duckdb.sql(f"SELECT * FROM read_parquet('{test_file}')")
对应的报错信息是:
duckdb.duckdb.IOException: IO Error: No files found that match the pattern "gcs:///some_bucket/some_dir/*.parquet"
但我确定这个Glob模式是能匹配到文件的——毕竟单个文件的读取是完全正常的。
用文件列表加载多个文件的尝试
另外,我尝试通过传入文件列表的方式加载多个文件,这个方法是可行的:
a = "gs://some_bucket/some_dir/a.parquet" b = "gs://some_bucket/some_dir/b.parquet" data = duckdb.sql(f"SELECT * FROM read_parquet(['{a}', '{b}'], union_by_name=true)")
不过我不确定这个方法和我遇到的Glob模式失效问题有没有直接关联。
补充:Glob模式依赖ListObjectV2接口的发现
后来看到相关解答提到:httpfs扩展的文档里暗示Glob模式仅支持S3。
我之前有点困惑,因为相关文档看起来GCS也是支持的,再仔细查阅后发现,DuckDB的Glob功能依赖ListObjectV2接口。
我查了一下GCS对这个接口的支持情况:
- 有一个7年前的讨论,询问GCS是否实现了ListObjectsV2接口
- 在GCP的一个issue跟踪线程里,提到GCS在2021年7月的更新中,其XML API预览版本支持了List Object V2功能,这个功能主要是为了提升和亚马逊S3工具、库的互操作性。
不过我目前还不太清楚,这是不是DuckDB能用Glob模式读取GCS文件的必要条件。
备注:内容来源于stack exchange,提问作者baxx




