如何通过SQL从Databricks将数据导出至Azure Blob外部存储?
将Databricks表数据导出到Azure Blob外部存储的SQL方案
一、先创建Azure Blob外部Stage(若未创建)
如果还没有对应外部存储的Stage,先通过SQL创建,这里以SAS令牌认证为例:
CREATE STAGE IF NOT EXISTS azure_blob_stage URL = 'abfss://<容器名称>@<存储账户名称>.dfs.core.windows.net/<存储路径>' CREDENTIALS = ( SAS_TOKEN = '<你的SAS令牌>' );
若使用Azure AD认证,可将
CREDENTIALS替换为AZURE_AD = true(需确保执行账号有Blob存储的写入权限)
二、两种导出数据的SQL方法
方法1:直接覆盖/追加写入Stage
适合全量导出,支持覆盖或追加现有数据:
- 全量覆盖:
INSERT OVERWRITE STAGE azure_blob_stage SELECT * FROM <你的源表名>;
- 增量追加:
INSERT INTO STAGE azure_blob_stage SELECT * FROM <你的源表名> WHERE <增量过滤条件>;
可指定导出文件格式,比如CSV:
INSERT OVERWRITE STAGE azure_blob_stage FILEFORMAT = CSV SELECT * FROM <源表名>
方法2:用COPY INTO实现增量导出(推荐用于增量场景)
如果需要只导出新增数据,避免重复写入,可使用COPY INTO:
COPY INTO 'abfss://<容器名称>@<存储账户名称>.dfs.core.windows.net/<存储路径>' FROM ( SELECT * FROM <你的源表名> WHERE <增量过滤条件> -- 比如 created_at > '2024-01-01' ) FILEFORMAT = PARQUET CREDENTIALS = (SAS_TOKEN = '<你的SAS令牌>') COPY_OPTIONS ('mergeSchema' = 'true');
三、控制导出文件的数量与大小
如果需要调整导出文件的数量(避免生成过多小文件或单个大文件),可在查询中使用REPARTITION或COALESCE:
-- 分成10个文件 INSERT OVERWRITE STAGE azure_blob_stage SELECT * FROM <你的源表名> REPARTITION(10); -- 合并为1个文件 INSERT OVERWRITE STAGE azure_blob_stage SELECT * FROM <你的源表名> COALESCE(1);
四、从外部服务执行SQL的方式
无需创建Databricks笔记本,可通过以下方式从外部服务执行上述SQL:
- JDBC/ODBC驱动:使用Databricks SQL Warehouse的JDBC/ODBC连接串,在Python、Java应用或ETL工具(如Airflow、Talend)中建立连接,直接执行SQL语句。
- Databricks REST API:调用Databricks的SQL执行API,提交SQL查询任务,获取执行结果。
内容的提问来源于stack exchange,提问作者dileep manuballa
相关产品推荐
相关产品推荐

