能否通过Databricks将ADLS Gen2的数据加载到SQL DW?具体如何操作?
可行性说明
完全可以使用Databricks实现ADLS Gen2到SQL DW(现Azure Synapse Analytics专用SQL池)的数据迁移,该方案是Azure生态内非常成熟的批量数据迁移路径,支持分布式处理TB甚至PB级别的表数据,兼容Parquet、CSV、ORC、JSON等绝大多数常见存储格式。
具体操作步骤
- 步骤1:完成前置权限配置
首先确保Databricks工作区已获得两项访问权限:一是ADLS Gen2存储账号的读取权限,可通过存储账号访问密钥、服务主体RBAC授权两种方式配置;二是SQL DW的写入权限,需要将Databricks集群的出站IP加入SQL DW的防火墙白名单,同时使用的SQL账号具备目标库的建表、数据插入权限。 - 步骤2:读取ADLS Gen2中的源表数据
先在Spark配置中添加ADLS Gen2的访问凭证,示例代码如下:spark.conf.set("fs.azure.account.key.<存储账号名称>.dfs.core.windows.net", "<存储账号访问密钥>")
之后直接读取对应路径下的表数据即可,以Parquet格式为例:df = spark.read.parquet("abfss://<容器名称>@<存储账号名称>.dfs.core.windows.net/<源表存储路径>")
你也可以提前完成ADLS Gen2到Databricks DBFS的挂载,后续直接用挂载路径读取数据即可。 - 步骤3:按需完成数据预处理(非必填)
如果需要对齐SQL DW的目标表结构,可以提前做字段类型转换、无效值清洗、schema校验处理,避免写入阶段出现类型不匹配报错;如果SQL DW侧还未创建目标表,Databricks支持写入时自动根据DataFrame的schema建表。 - 步骤4:配置SQL DW连接参数
Databricks写入SQL DW依赖PolyBase做批量数据导入,需要提前准备好JDBC连接信息和临时中转存储路径,示例配置如下:# SQL DW JDBC连接配置 dwHost = "<SQL DW服务器地址>.database.windows.net" dwDb = "<目标数据库名>" dwUser = "<SQL账号用户名>" dwPwd = "<SQL账号密码>" jdbcUrl = f"jdbc:sqlserver://{dwHost}:1433;database={dwDb};user={dwUser};password={dwPwd};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" # 临时中转存储路径,可复用当前ADLS Gen2的存储空间 tempPath = "abfss://<临时容器名>@<存储账号名称>.dfs.core.windows.net/<临时目录路径>" - 步骤5:执行数据写入操作
按需求选择写入模式:全表覆盖用overwrite模式,增量追加用append模式,单表写入示例代码如下:
如果有多张表需要批量迁移,只需要循环遍历ADLS Gen2下的不同表路径,重复执行读取、写入逻辑即可。df.write \ .format("com.databricks.spark.sqldw") \ .option("url", jdbcUrl) \ .option("dbtable", "<SQL DW侧目标表名>") \ .option("tempDir", tempPath) \ .mode("overwrite") \ .save()
注意事项
- 大表迁移时可临时调高SQL DW的DWU配额,提升批量写入速度,迁移完成后再调回日常规格节省成本
- 可根据源表数据量调整Databricks集群的节点规格和并行度,避免迁移耗时过长
内容的提问来源于stack exchange,提问作者Misaki Gome
相关产品推荐
相关产品推荐

