Databricks gold层数据表导出至Azure SQL Database及存储位置咨询
Databricks Gold层表导出到Azure SQL及存储位置问题解答
存储位置疑问解答
你在同资源组找不到对应存储账户属于正常情况:
- 如果你使用的是Databricks托管Unity Catalog或托管Hive元存储的托管表,底层数据默认存储在Databricks侧管理的Azure存储账户中,这类存储账户归属Databricks官方订阅,不会出现在你的资源组内,也就是你所说的隐式存储。
- 只有你自行创建的外部表,数据才会存储在你当前订阅下的存储账户中,这类情况你才能在资源组内找到对应存储资源。
- 旧版DBFS根存储同样属于Databricks托管存储,也不会出现在你的资源组列表中。
Gold层表导出到Azure SQL Database的可行方案
你无需获取底层存储的直接访问权限,直接在Databricks工作区的Notebook中运行Spark代码即可完成导出,以下是两种生产环境常用方案:
方案1:原生JDBC导出(适配全场景,中小规模表首选)
提前在Azure SQL Database中创建好目标表结构(也可让Spark自动生成,生产环境建议提前规划Schema),运行以下代码替换占位符即可:
# Azure SQL 连接配置 jdbc_url = "jdbc:sqlserver://<SQL服务器名>.database.windows.net:1433;database=<SQL库名>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" conn_props = { "user": "<SQL登录用户名>", "password": dbutils.secrets.get(scope="<你的机密Scope名>", key="<SQL密码对应的机密Key名>"), # 敏感信息建议存在Databricks机密中,避免明文泄露 "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" } # 读取Gold层表 gold_df = spark.read.table("gold.<你的表名>") # 写入Azure SQL # mode参数可选:overwrite(覆写全表)/append(追加数据)/ignore(表存在则跳过)/error(表存在则报错) gold_df.write.jdbc( url=jdbc_url, table="<SQL端目标表名>", mode="overwrite", properties=conn_props )
方案2:优化型Azure SQL连接器(大规模表首选,性能更高)
Databricks Runtime 11.3及以上版本内置了优化过的Azure SQL专用连接器,写入性能比原生JDBC高3~10倍,代码示例如下:
gold_df.write \ .format("sqlserver") \ .option("server", "<SQL服务器名>.database.windows.net") \ .option("databaseName", "<SQL库名>") \ .option("user", "<SQL登录用户名>") \ .option("password", dbutils.secrets.get(scope="<你的机密Scope名>", key="<SQL密码对应的机密Key名>")) \ .option("dbtable", "<SQL端目标表名>") \ .option("batchSize", 10000) \ .mode("append") \ .save()
如果是增量同步场景,你可以先过滤Gold层表中新增/变更的数据,再用append模式写入即可。
内容的提问来源于stack exchange,提问作者Bogdan Osyka
相关产品推荐
相关产品推荐

