es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Nombre de las claves secretas de Azure Databricks en propiedad jdbc.

Acabo de crear un alcance secreto compatible con Azure Key Vault.
Mis siguientes nombres de secretos (almacenados como secretos en Key Vault) para conectarme a la base de datos de Azure SQL son:
1. jdbcusername
2. jdbcpassword

Después de eso, he creado un alcance secreto en Databricks. El nombre de este alcance secreto es secretscopeadbr.

En mi cuaderno tengo el siguiente código:
Este código tiene la conexión JDBC basada en mi base de datos de Azure SQL y escribe datos desde un dataframe a una tabla única en mi base de datos de Azure SQL.

from pyspark.sql import *
import pandas as pd

<h1>Leer el archivo Parquet</h1>

outerjoindfparquet = spark.read.format('parquet').load('dbfs:/newjouterjoindfparquet.parquet')
display(outerjoindfparquet)

<h1>Escribir archivo Parquet a la base de datos de Azure SQL</h1>

mountdatabricksjdbcHostname = "sql-ja-dev.database.windows.net"
jdbcPort = "1433"
jdbcDatabase = "sqldb-ja-dev"
properties = {
        "user": "jdbcusername",
        "password": "jdbcpassword"
    }
url = "jdbc:sqlserver://{0}:{1};database={2}".format(mountdatabricksjdbcHostname, jdbcPort, jdbcDatabase)
filedf = sqlContext.read.parquet("dbfs:/newjouterjoindfparquet.parquet", header=True)

filedf1 = DataFrameWriter(filedf)
filedf1.jdbc(url=url, table="Fact_SalesOrder", mode="overwrite", properties=properties)

El problema:
Los valores de secretos insertados en las propiedades no son reconocidos.

Mensaje de error:
com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user ‘jdbcUsername’

¿Alguna sugerencia? ¡Muchas gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que los valores secretos insertados en las propiedades no están siendo reconocidos. Para resolver este problema, actualice la variable de propiedades para incluir los valores secretos reales almacenados en Key Vault para jdbcusername y jdbcpassword.

    Aquí hay un fragmento de código actualizado:

    from pyspark.sql import *
    import pandas as pd
    import dbutils
    
    #Leer el archivo parquet
    outerjoindfparquet = spark.read.format('parquet').load('dbfs:/newjouterjoindfparquet.parquet')
    display (outerjoindfparquet)
    
    #Crear un ámbito secreto respaldado por Azure Key Vault
    dbutils.secrets.createScope("secretscopeadbr")
    
    #Obtener los valores secretos para jdbcusername y jdbcpassword
    jdbcusername = dbutils.secrets.get(scope="secretscopeadbr", key="jdbcusername")
    jdbcpassword = dbutils.secrets.get(scope="secretscopeadbr", key="jdbcpassword")
    
    #Escribir archivo Parquet en Azure SQL Database usando los valores secretos obtenidos
    mountdatabricksjdbcHostname = "sql-ja-dev.database.windows.net"
    jdbcPort = "1433"
    jdbcDatabase = "sqldb-ja-dev"
    properties = {
            "user": jdbcusername,
            "password": jdbcpassword
        }
    url = "jdbc:sqlserver://{0}:{1};database={2}".format(mountdatabricksjdbcHostname, jdbcPort, jdbcDatabase)
    filedf = sqlContext.read.parquet("dbfs:/newjouterjoindfparquet.parquet", header=True)
    
    filedf1 = DataFrameWriter(filedf)
    filedf1.jdbc(url=url, table="Fact_SalesOrder", mode="overwrite", properties=properties) 
    

    Tenga en cuenta que hemos añadido el código necesario para obtener los valores secretos usando el método dbutils.secrets.get(scope="secretscopeadbr", key="<secret-name>") y asignarlos a las variables correspondientes. También hemos actualizado la variable properties para usar los valores secretos obtenidos para jdbcusername y jdbcpassword.

Comments are closed.