You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动