【问题标题】:PySpark to Azure SQL Database connection issuePySpark 到 Azure SQL 数据库的连接问题
【发布时间】:2022-08-04 18:14:37
【问题描述】:

我正在尝试使用 PySpark 从 Azure Synapse 工作区笔记本连接到 Azure SQL 数据库。我也想使用 Active Directory 集成身份验证。所以我尝试过:

jdbc_df = spark.read \\
        .format(\"com.microsoft.sqlserver.jdbc.spark\") \\
        .option(\"url\", \"jdbc:sqlserver://my_server_name.database.windows.net:1433\") \\
        .option(\"database\",\"my_db_name\") \\
        .option(\"dbtable\", \"my_table_or_query\") \\
        .option(\"authentication\", \"ActiveDirectoryIntegrated\") \\
        .option(\"encrypt\", \"true\") \\
        .option(\"hostNameInCertificate\", \"*.database.windows.net\") \\
        .load()

我也尝试过相同的方法,但语法不同

jdbcUrl = \"jdbc:sqlserver://my_server_name.database.windows.net:1433;database=my_db_name;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;Authentication=ActiveDirectoryIntegrated\"

 pushdown_query = \"SELECT col1 FROM my_table_name\"
 connectionProperties = {
   \"driver\" : \"com.microsoft.sqlserver.jdbc.SQLServerDriver\"
 }
 df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query)
 display(df)

在这两种情况下我都会出错

IllegalArgumentException:KrbException:找不到默认领域

我做错了什么?

    标签: python apache-spark pyspark azure-active-directory azure-sql-database


    【解决方案1】:

    您可以使用以下代码使用 Python 从 Azure SQL 数据库中读取数据:

    # define sql database parameters
    jdbcHostname = "my_server_name.database.windows.net"
    jdbcDatabase = "my_db_name"
    jdbcPort = "1433"
    username = "username"
    password = "XXXXXXXXXX"
    jdbcUrl = "jdbc:sqlserver://{0}:{1};database={2}".format(jdbcHostname, jdbcPort, jdbcDatabase)
    
    # passing parameters in connection properties
    connectionProperties = {
    "user" : username,
    "password" : password,
    "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    }
    
    # sample query
    pushdown_query = "SELECT col1 FROM my_table_name"
    
    # reading data 
    df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, properties=connectionProperties)
    
    # print data
    display(df)
    

    【讨论】:

    • 这基本上就是我正在使用的,唯一的区别是我想使用 Active Directory 集成身份验证,而不是 SQL 登录。
    • 您可以先尝试使用 SQL 登录,并且它可以正常工作,我们可以提供 AD 登录。
    • 刚刚做了,而且有效!但我仍然想使用 AD 身份验证,因为我在我将用于运行此脚本的 Synapse 管道中的那个 SQL 数据库的链接服务中使用系统分配的托管标识。
    【解决方案2】:

    终于我找到了解决方案!首先应该创建工作联动服务到 Synapse Analytics 中使用身份验证类型的 Azure SQL 数据库系统分配的托管标识“。比你可以在你的 PySpark Notebook 中引用它。不要混淆那个方法获取连接字符串用于获取访问令牌 - 它实际上返回的不是连接字符串而是令牌。

    jdbcUrl = "jdbc:sqlserver://my_server_name.database.windows.net:1433;database=my_db_name;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
    
    token=TokenLibrary.getConnectionString("AzureSQLLinkedServiceName")
    
    pushdown_query = "(SELECT col1 FROM my_table_name) as tbl"
    connectionProperties = {
     "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver",
     "accessToken" : token
    }
    df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, properties=connectionProperties)
    display(df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2021-12-08
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多