Fabric Notebook使用PySpark通过JDBC连接Fabric SQL数据库的连接问题求助
我之前在Fabric环境里折腾JDBC连接的时候也踩过几乎一模一样的坑,结合你的问题描述和我当时的排查经验,给你梳理几个关键的修复方向:
一、先修正连接字符串的核心参数
你目前的连接字符串有个致命细节错了:hostNameInCertificate应该用*.database.fabric.microsoft.com,而不是*.database.windows.net。Fabric SQL数据库的SSL证书是专属的,强行套用Azure SQL的证书域名会导致身份验证失败,这很可能是你AD认证报错的主要原因之一。
另外,Fabric云端Notebook环境不支持ActiveDirectoryInteractive的交互弹窗,所以建议换成ActiveDirectoryPassword模式,直接用账号密码完成认证。修正后的连接字符串示例:
jdbc_url = "jdbc:sqlserver://hit42n7mdsxgfsduxifea5jkpru-cxxbuh5gkjsllp42x2mebvpgzm.database.fabric.microsoft.com:1433;database=db_gold-333da4e5-5b90-459a-b455-e09dg8ac754c;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.fabric.microsoft.com;loginTimeout=60;authentication=ActiveDirectoryPassword"
二、权限必须到位,缺一不可
别小看权限问题,Fabric的权限逻辑是双层的:
- Fabric工作区权限:确保你的AAD账号(
name.surname@company.com)是目标SQL数据库所在工作区的「参与者」及以上权限,没有工作区权限的话,数据库层面的权限再高也没用。 - 数据库用户权限:进入Fabric SQL数据库的「权限」面板,把你的AAD账号添加为数据库用户,并且分配
db_datareader+db_datawriter(如果要写数据)的角色,或者直接给db_owner测试用(生产环境不建议)。
三、代码里的小bug要先改
你的write_df_to_sql_db函数里有个变量错误:参数传的是df,但你用df_swp来创建Spark DataFrame,这会直接导致变量未定义的报错,先改成:
def write_df_to_sql_db(df, trg_tbl_name='dbo.final'): spark_df = spark.createDataFrame(df) spark_df.write \ .jdbc( url=jdbc_url, table=trg_tbl_name, mode="overwrite", properties=connection_properties ) return True
四、先测试读操作,再尝试写
建议先简化场景,用读操作验证连接是否正常,比如找一个数据库里已有的小表测试:
test_df = spark.read.jdbc(url=jdbc_url, table="dbo.your_test_table", properties=connection_properties) test_df.show(5)
如果读操作能成功,再去排查写操作的问题,这样能快速缩小范围。
最后补充
跳过认证的方式肯定行不通,Fabric SQL默认强制要求AAD身份验证,不支持匿名访问。如果你的公司启用了MFA,ActiveDirectoryPassword可能也会失效,这时候可以试试用Fabric的MSI(托管身份)认证,连接字符串改成authentication=ActiveDirectoryMSI,同时给工作区的MSI分配数据库权限,这种方式更适合生产环境的自动化场景。
内容来源于stack exchange

