如何用DuckDB从Azure Blob Storage容器加载CSV文件(Python方案)
使用Python将Azure Blob Storage中的CSV加载至DuckDB
前置准备
- 安装依赖包:
pip install duckdb azure-storage-blob - 获取Azure存储账户的连接字符串(或账户名+访问密钥),用于访问私有Blob容器;若容器为公开只读,可跳过凭证配置。
方案一:直接通过DuckDB扩展加载(推荐)
无需下载文件,直接通过DuckDB的azure和httpfs扩展读取Blob中的CSV,适合大文件场景。
import duckdb # 建立DuckDB连接 conn = duckdb.connect() # 加载必要扩展 conn.execute("INSTALL httpfs;") conn.execute("LOAD httpfs;") conn.execute("INSTALL azure;") conn.execute("LOAD azure;") # 配置Azure访问凭证(二选一) # 方式1:使用存储账户连接字符串 conn.execute("SET azure_connection_string = '你的Azure存储账户连接字符串';") # 方式2:使用账户名+访问密钥 # conn.execute("SET azure_account_name = '你的存储账户名';") # conn.execute("SET azure_account_key = '你的存储账户访问密钥';") # 读取单个或多个CSV文件(支持通配符*) # 路径格式:azure://<容器名>/<文件路径> df = conn.execute(""" SELECT * FROM read_csv('azure://你的容器名/*.csv', header=true) """).fetch_df() # 查看数据 print(df.head()) # 可选:将数据导入DuckDB本地表 conn.execute(""" CREATE TABLE IF NOT EXISTS my_blob_data AS SELECT * FROM read_csv('azure://你的容器名/*.csv', header=true) """) # 关闭连接 conn.close()
方案二:先下载CSV到本地再加载
适合需要对本地文件做预处理的场景。
import duckdb from azure.storage.blob import BlobServiceClient import os import shutil # 初始化Azure Blob客户端 connection_string = "你的Azure存储账户连接字符串" container_client = BlobServiceClient.from_connection_string(connection_string).get_container_client("你的容器名") # 创建临时目录存储下载的CSV temp_dir = "./temp_blob_csv" os.makedirs(temp_dir, exist_ok=True) # 下载容器中所有CSV文件 for blob in container_client.list_blobs(): if blob.name.endswith(".csv"): local_path = os.path.join(temp_dir, blob.name) os.makedirs(os.path.dirname(local_path), exist_ok=True) with open(local_path, "wb") as f: f.write(container_client.get_blob_client(blob).download_blob().readall()) # 用DuckDB加载本地CSV conn = duckdb.connect() df = conn.execute(""" SELECT * FROM read_csv('./temp_blob_csv/*.csv', header=true) """).fetch_df() print(df.head()) # 可选:清理临时文件 shutil.rmtree(temp_dir) conn.close()
注意事项
- 若Blob容器为公开只读,可省略凭证配置,直接使用路径
azure://<容器名>/<文件路径>读取 read_csv支持自定义参数,比如指定分隔符sep=';'、编码encoding='gbk'、列类型types={'id': 'INT'}等,可根据实际CSV格式调整- 大文件优先使用方案一,避免本地磁盘占用和下载耗时
内容的提问来源于stack exchange,提问作者Péter Szilvási
相关产品推荐
相关产品推荐

