如何使用DuckDB 0.8.0读取Google Storage中的CSV文件
在DuckDB 0.8.0中读取Google Storage CSV文件的解决方案
问题背景
- 使用DuckDB 0.8.0版本,需读取Google Storage中路径为
gs://some_bucket/some_file.csv的CSV文件 - Pandas可通过
pd.read_csv("gs://some_bucket/some_file.csv")直接读取,但相同逻辑在DuckDB中无效 - 查阅DuckDB官方S3导入文档时,因文档侧重AWS S3场景,对Google Storage的配置产生困惑
初始尝试与错误分析
初始配置步骤
首先猜测需要安装并加载httpfs扩展(DuckDB用于处理远程文件的核心扩展):
INSTALL httpfs; LOAD httpfs;
随后通过Google Cloud控制台生成HMAC密钥,从环境变量中获取密钥值并配置:
import duckdb import os duckdb.sql("LOAD httpfs;") hmac_access = os.getenv('GOOGLE_HMAC_ACCESS_ID') hmac_secret = os.getenv('GOOGLE_HMAC_SECRET') duckdb.sql(f"SET s3_access_key_id='{hmac_access}';") duckdb.sql(f"SET s3_secret_access_key='{hmac_secret}';")
两种失败方法及原因
方法1:直接查询路径
执行代码:
duckdb.sql(f"SELECT * FROM '{gcp_path_1}'").show()
报错:
duckdb.CatalogException: Catalog Error: Table with name {gcp_path_1} does not exist! Did you mean "pg_am"?
原因:DuckDB默认将单引号包裹的路径识别为本地表名,而非远程文件路径,需先完成正确的端点配置,才能让扩展识别gs://格式的路径。
方法2:使用read_csv函数
执行代码:
duckdb.sql(f"SELECT * from read_csv('{gcp_path_1}', AUTO_DETECT=TRUE);")
报错:
duckdb.HTTPException: HTTP Error: HTTP GET error on 'https://some_bucket.s3.amazonaws.com/some_file.csv' (HTTP 400)
原因:DuckDB默认将gs://路径解析为AWS S3的请求格式,把请求发送到AWS S3端点而非Google Storage的专属端点,导致请求无效。
解决办法
添加Google Storage的端点配置即可解决所有问题:
SET s3_endpoint='storage.googleapis.com';
完整可用代码
import duckdb import os # 首次运行需执行INSTALL,后续重复运行可省略 duckdb.sql("INSTALL httpfs;") duckdb.sql("LOAD httpfs;") # 从环境变量读取Google HMAC密钥 hmac_access = os.getenv('GOOGLE_HMAC_ACCESS_ID') hmac_secret = os.getenv('GOOGLE_HMAC_SECRET') # 配置密钥与Google Storage专属端点 duckdb.sql(f"SET s3_access_key_id='{hmac_access}';") duckdb.sql(f"SET s3_secret_access_key='{hmac_secret}';") duckdb.sql("SET s3_endpoint='storage.googleapis.com';") gcp_path_1 = "gs://some_bucket/some_file.csv" # 方法1:直接查询远程CSV文件 duckdb.sql(f"SELECT * FROM '{gcp_path_1}'").show() # 方法2:使用read_csv函数(支持更多自定义参数) duckdb.sql(f"SELECT * from read_csv('{gcp_path_1}', AUTO_DETECT=TRUE);").show()
内容的提问来源于stack exchange,提问作者baxx
相关产品推荐
相关产品推荐

