Esercitazione: Estrarre, trasformare e caricare dati con Azure Databricks

In questa esercitazione viene eseguita un'operazione ETL (Extract, Transform, Load, estrazione, trasformazione e caricamento dei dati) tramite Azure Databricks. I dati vengono estratti da Azure Data Lake Storage Gen2 in Azure Databricks, vengono sottoposti a trasformazioni in Azure Databricks e quindi vengono caricati in Azure Synapse Analytics.

I passaggi in questa esercitazione usano il connettore di Azure Synapse per Azure Databricks per trasferire i dati in Azure Databricks. Questo connettore usa a sua volta l'Archiviazione BLOB di Azure come archivio temporaneo per i dati trasferiti tra un cluster di Azure Databricks e Azure Synapse.

L'illustrazione seguente mostra il flusso dell'applicazione:

Azure Databricks with Data Lake Store and Azure Synapse

Questa esercitazione illustra le attività seguenti:

  • Creare un servizio Azure Databricks.
  • Creare un cluster Spark in Azure Databricks.
  • Creare un file system nell'account Data Lake Storage Gen2.
  • Caricare i dati di esempio nell'account Azure Data Lake Storage Gen2.
  • Creare un'entità servizio.
  • Estrarre i dati dall'account Azure Data Lake Storage Gen2.
  • Trasformare i dati in Azure Databricks.
  • Caricare i dati in Azure Synapse.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Nota

Questa esercitazione non può essere eseguita usando una sottoscrizione di valutazione gratuita di Azure. Se l'utente ha un account gratuito, andare al proprio profilo e modificare la sottoscrizione a con pagamento in base al consumo. Per altre informazioni, vedere Account gratuito di Azure. Quindi rimuovere il limite di spesa e richiedere un aumento della quota per le vCPU nell'area dell'utente. Quando si crea l'area di lavoro Azure Databricks, è possibile selezionare il piano tariffario Versione di valutazione (Premium - Unità Databricks gratuite per 14 giorni) per concedere l'accesso gratuito Premium per 14 giorni dell'area di lavoro alle Unità Databricks di Azure.

Prerequisiti

Completare queste attività prima di iniziare questa esercitazione:

Raccogliere le informazioni necessarie

Assicurarsi di soddisfare i prerequisiti di questa esercitazione.

Prima di iniziare, è necessario disporre delle informazioni seguenti:

✔️ Nome del database, nome del server di database, nome utente e password di Azure Synapse.

✔️ Chiave di accesso dell'account di archiviazione BLOB.

✔️ Nome dell'account di archiviazione di Data Lake Archiviazione Gen2.

✔️ ID tenant della sottoscrizione.

✔️ ID applicazione dell'app registrata con Microsoft Entra ID (in precedenza Azure Active Directory).

✔️ Chiave di autenticazione per l'app registrata con Microsoft Entra ID (in precedenza Azure Active Directory).

Creare un servizio Azure Databricks

In questa sezione si crea un servizio Azure Databricks con il portale di Azure.

  1. Dal menu del portale di Azure, selezionare Crea una risorsa.

    Create a resource on Azure portal

    Selezionare quindi Analisi>Azure Databricks.

    Create Azure Databricks on Azure portal

  2. In Servizio Azure Databricks specificare i valori seguenti per creare un servizio Databricks:

    Proprietà Descrizione
    Nome area di lavoro Specificare un nome per l'area di lavoro di Databricks.
    Abbonamento Selezionare la sottoscrizione di Azure nell'elenco a discesa.
    Gruppo di risorse Specificare se si vuole creare un nuovo gruppo di risorse o usarne uno esistente. Un gruppo di risorse è un contenitore con risorse correlate per una soluzione di Azure. Per altre informazioni, vedere Panoramica di Gestione risorse di Microsoft Azure.
    Location Selezionare Stati Uniti occidentali 2. Per le altre aree disponibili, vedere Prodotti disponibili in base all'area.
    Piano tariffario Selezionare Standard.
  3. La creazione dell'account richiede alcuni minuti. Per monitorare lo stato dell'operazione, visualizzare l'indicatore di stato nella parte superiore.

  4. Selezionare Aggiungi al dashboardquindi selezionare Crea.

Creare un cluster Spark in Azure Databricks

  1. Nel portale di Azure passare al servizio Databricks creato e selezionare Launch Workspace (Avvia l'area di lavoro).

  2. Si verrà reindirizzati al portale di Azure Databricks. Nel portale selezionare Cluster.

    Databricks on Azure

  3. Nella pagina New cluster (Nuovo cluster) specificare i valori per creare un cluster.

    Create Databricks Spark cluster on Azure

  4. Specificare i valori per i campi seguenti e accettare i valori predefiniti per gli altri campi:

    • Immettere un nome per il cluster.

    • Assicurarsi di selezionare la casella di controllo Termina dopo __ minuti di inattività . Se il cluster non viene usato, specificare una durata in minuti per terminarlo.

    • Selezionare Crea cluster. Quando il cluster è in esecuzione, è possibile collegarvi notebook ed eseguire processi Spark.

Creare un file system nell'account Azure Data Lake Storage Gen2

In questa sezione viene creato un notebook nell'area di lavoro di Azure Databricks e quindi vengono eseguiti frammenti di codice per configurare l'account di archiviazione

  1. Nel portale di Azure passare al servizio Azure Databricks creato e selezionare Launch Workspace (Avvia l'area di lavoro).

  2. A sinistra selezionare Workspace (Area di lavoro). Nell'elenco a discesa Workspace (Area di lavoro) selezionare Create (Crea)>Notebook.

    Create a notebook in Databricks

  3. Nella finestra di dialogo Create Notebook (Crea un notebook) immettere un nome per il notebook. Selezionare Scala come linguaggio e quindi selezionare il cluster Spark creato in precedenza.

    Provide details for a notebook in Databricks

  4. Seleziona Crea.

  5. Il blocco di codice seguente imposta le credenziali dell'entità servizio predefinita per qualsiasi account di Azure Data Lake Storage Gen 2 a cui si accede nella sessione Spark. Il secondo blocco di codice accoda il nome dell'account all'impostazione per specificare le credenziali per un account di Azure Data Lake Storage Gen 2 specifico. Copiare e incollare uno dei due blocchi di codice nella prima cella del notebook di Azure Databricks.

    Configurazione della sessione

    val appID = "<appID>"
    val secret = "<secret>"
    val tenantID = "<tenant-id>"
    
    spark.conf.set("fs.azure.account.auth.type", "OAuth")
    spark.conf.set("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
    spark.conf.set("fs.azure.account.oauth2.client.id", "<appID>")
    spark.conf.set("fs.azure.account.oauth2.client.secret", "<secret>")
    spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<tenant-id>/oauth2/token")
    spark.conf.set("fs.azure.createRemoteFileSystemDuringInitialization", "true")
    

    Configurazione dell'account

    val storageAccountName = "<storage-account-name>"
    val appID = "<app-id>"
    val secret = "<secret>"
    val fileSystemName = "<file-system-name>"
    val tenantID = "<tenant-id>"
    
    spark.conf.set("fs.azure.account.auth.type." + storageAccountName + ".dfs.core.windows.net", "OAuth")
    spark.conf.set("fs.azure.account.oauth.provider.type." + storageAccountName + ".dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
    spark.conf.set("fs.azure.account.oauth2.client.id." + storageAccountName + ".dfs.core.windows.net", "" + appID + "")
    spark.conf.set("fs.azure.account.oauth2.client.secret." + storageAccountName + ".dfs.core.windows.net", "" + secret + "")
    spark.conf.set("fs.azure.account.oauth2.client.endpoint." + storageAccountName + ".dfs.core.windows.net", "https://login.microsoftonline.com/" + tenantID + "/oauth2/token")
    spark.conf.set("fs.azure.createRemoteFileSystemDuringInitialization", "true")
    dbutils.fs.ls("abfss://" + fileSystemName  + "@" + storageAccountName + ".dfs.core.windows.net/")
    spark.conf.set("fs.azure.createRemoteFileSystemDuringInitialization", "false")
    
  6. In questo blocco di codice sostituire i valori segnaposto <app-id>, <secret>, <tenant-id> e <storage-account-name> con i valori raccolti completando i prerequisiti di questa esercitazione. Sostituire il valore segnaposto <file-system-name> con il nome che si vuole assegnare al file system.

    • <app-id> e <secret> provengono dall'app che è stata registrata con Active Directory durante la creazione di un'entità servizio.

    • <tenant-id> proviene dalla sottoscrizione.

    • <storage-account-name> è il nome dell'account di archiviazione Azure Data Lake Storage Gen2.

  7. Premere MAIUSC + INVIO per eseguire il codice in questo blocco.

Inserire dati di esempio nell'account Azure Data Lake Storage Gen2

Prima di iniziare con questa sezione, è necessario completare i prerequisiti seguenti:

Immettere il codice seguente in una cella del notebook:

%sh wget -P /tmp https://raw.githubusercontent.com/Azure/usql/master/Examples/Samples/Data/json/radiowebsite/small_radio_json.json

Nella cella, premere MAIUSC+INVIO per eseguire il codice.

In una nuova cella al di sotto di questa immettere il codice seguente, sostituendo i valori tra parentesi con gli stessi valori usati in precedenza:

dbutils.fs.cp("file:///tmp/small_radio_json.json", "abfss://" + fileSystemName + "@" + storageAccountName + ".dfs.core.windows.net/")

Nella cella, premere MAIUSC+INVIO per eseguire il codice.

Estrarre i dati dall'account Azure Data Lake Storage Gen2

  1. È ora possibile caricare il file JSON di esempio come dataframe in Azure Databricks. Incollare il codice seguente in una nuova cella. Sostituire i segnaposto tra parentesi quadre con i valori.

    val df = spark.read.json("abfss://" + fileSystemName + "@" + storageAccountName + ".dfs.core.windows.net/small_radio_json.json")
    
  2. Premere MAIUSC + INVIO per eseguire il codice in questo blocco.

  3. Eseguire il codice seguente per visualizzare il contenuto del dataframe:

    df.show()
    

    L'output visualizzato dovrebbe essere simile al frammento di codice seguente:

    +---------------------+---------+---------+------+-------------+----------+---------+-------+--------------------+------+--------+-------------+---------+--------------------+------+-------------+------+
    |               artist|     auth|firstName|gender|itemInSession|  lastName|   length|  level|            location|method|    page| registration|sessionId|                song|status|           ts|userId|
    +---------------------+---------+---------+------+-------------+----------+---------+-------+--------------------+------+--------+-------------+---------+--------------------+------+-------------+------+
    | El Arrebato         |Logged In| Annalyse|     F|            2|Montgomery|234.57914| free  |  Killeen-Temple, TX|   PUT|NextSong|1384448062332|     1879|Quiero Quererte Q...|   200|1409318650332|   309|
    | Creedence Clearwa...|Logged In|   Dylann|     M|            9|    Thomas|340.87138| paid  |       Anchorage, AK|   PUT|NextSong|1400723739332|       10|        Born To Move|   200|1409318653332|    11|
    | Gorillaz            |Logged In|     Liam|     M|           11|     Watts|246.17751| paid  |New York-Newark-J...|   PUT|NextSong|1406279422332|     2047|                DARE|   200|1409318685332|   201|
    ...
    ...
    

    I dati sono stati estratti da Azure Data Lake Storage Gen2 in Azure Databricks.

Trasformare dati in Azure Databricks

I dati di esempio non elaborati del file small_radio_json.json sono relativi agli ascoltatori di una stazione radio e includono diverse colonne. In questa sezione i dati vengono trasformati in modo da recuperare solo colonne specifiche dal set di dati.

  1. Recuperare prima di tutto solo le colonne firstName, lastName, gender, location e level dal dataframe già creato.

    val specificColumnsDf = df.select("firstname", "lastname", "gender", "location", "level")
    specificColumnsDf.show()
    

    L'output restituito sarà simile al frammento di codice seguente:

    +---------+----------+------+--------------------+-----+
    |firstname|  lastname|gender|            location|level|
    +---------+----------+------+--------------------+-----+
    | Annalyse|Montgomery|     F|  Killeen-Temple, TX| free|
    |   Dylann|    Thomas|     M|       Anchorage, AK| paid|
    |     Liam|     Watts|     M|New York-Newark-J...| paid|
    |     Tess|  Townsend|     F|Nashville-Davidso...| free|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...| free|
    |     Alan|     Morse|     M|Chicago-Napervill...| paid|
    |Gabriella|   Shelton|     F|San Jose-Sunnyval...| free|
    |   Elijah|  Williams|     M|Detroit-Warren-De...| paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...| free|
    |     Tess|  Townsend|     F|Nashville-Davidso...| free|
    |     Alan|     Morse|     M|Chicago-Napervill...| paid|
    |     Liam|     Watts|     M|New York-Newark-J...| paid|
    |     Liam|     Watts|     M|New York-Newark-J...| paid|
    |   Dylann|    Thomas|     M|       Anchorage, AK| paid|
    |     Alan|     Morse|     M|Chicago-Napervill...| paid|
    |   Elijah|  Williams|     M|Detroit-Warren-De...| paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...| free|
    |     Alan|     Morse|     M|Chicago-Napervill...| paid|
    |   Dylann|    Thomas|     M|       Anchorage, AK| paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...| free|
    +---------+----------+------+--------------------+-----+
    
  2. È possibile trasformare ulteriormente questi dati per rinominare la colonna level in subscription_type.

    val renamedColumnsDF = specificColumnsDf.withColumnRenamed("level", "subscription_type")
    renamedColumnsDF.show()
    

    L'output restituito sarà simile al frammento di codice seguente.

    +---------+----------+------+--------------------+-----------------+
    |firstname|  lastname|gender|            location|subscription_type|
    +---------+----------+------+--------------------+-----------------+
    | Annalyse|Montgomery|     F|  Killeen-Temple, TX|             free|
    |   Dylann|    Thomas|     M|       Anchorage, AK|             paid|
    |     Liam|     Watts|     M|New York-Newark-J...|             paid|
    |     Tess|  Townsend|     F|Nashville-Davidso...|             free|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...|             free|
    |     Alan|     Morse|     M|Chicago-Napervill...|             paid|
    |Gabriella|   Shelton|     F|San Jose-Sunnyval...|             free|
    |   Elijah|  Williams|     M|Detroit-Warren-De...|             paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...|             free|
    |     Tess|  Townsend|     F|Nashville-Davidso...|             free|
    |     Alan|     Morse|     M|Chicago-Napervill...|             paid|
    |     Liam|     Watts|     M|New York-Newark-J...|             paid|
    |     Liam|     Watts|     M|New York-Newark-J...|             paid|
    |   Dylann|    Thomas|     M|       Anchorage, AK|             paid|
    |     Alan|     Morse|     M|Chicago-Napervill...|             paid|
    |   Elijah|  Williams|     M|Detroit-Warren-De...|             paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...|             free|
    |     Alan|     Morse|     M|Chicago-Napervill...|             paid|
    |   Dylann|    Thomas|     M|       Anchorage, AK|             paid|
    |  Margaux|     Smith|     F|Atlanta-Sandy Spr...|             free|
    +---------+----------+------+--------------------+-----------------+
    

Caricare i dati in Azure Synapse

In questa sezione i dati trasformati vengono caricati in Azure Synapse. Verrà usato il connettore di Azure Synapse per Azure Databricks per caricare direttamente un dataframe come tabella nel pool di Synapse Spark.

Come indicato in precedenza, il connettore di Azure Synapse usa l'Archiviazione BLOB di Azure come archivio temporaneo per caricare i dati tra Azure Databricks e Azure Synapse. Specificare quindi prima di tutto la configurazione per la connessione all'account di archiviazione. È necessario che l'account sia già stato creato come parte dei prerequisiti per questo articolo.

  1. Specificare la configurazione per l'accesso all'account di archiviazione di Azure da Azure Databricks.

    val blobStorage = "<blob-storage-account-name>.blob.core.windows.net"
    val blobContainer = "<blob-container-name>"
    val blobAccessKey =  "<access-key>"
    
  2. Specificare una cartella temporanea da usare durante lo spostamento dei dati tra Azure Databricks e Azure Synapse.

    val tempDir = "wasbs://" + blobContainer + "@" + blobStorage +"/tempDirs"
    
  3. Eseguire il frammento di codice seguente per archiviare le chiavi di accesso dell'Archiviazione BLOB di Azure nella configurazione. In questo modo si assicura che non sia necessario mantenere la chiave di accesso nel notebook in testo normale.

    val acntInfo = "fs.azure.account.key."+ blobStorage
    sc.hadoopConfiguration.set(acntInfo, blobAccessKey)
    
  4. Specificare i valori per la connessione all'istanza di Azure Synapse. È necessario avere creato un servizio Azure Synapse Analytics come prerequisito. Usare il nome completo del server per dwServer. Ad esempio: <servername>.database.windows.net.

    //Azure Synapse related settings
    val dwDatabase = "<database-name>"
    val dwServer = "<database-server-name>"
    val dwUser = "<user-name>"
    val dwPass = "<password>"
    val dwJdbcPort =  "1433"
    val dwJdbcExtraOptions = "encrypt=true;trustServerCertificate=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
    val sqlDwUrl = "jdbc:sqlserver://" + dwServer + ":" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass + ";$dwJdbcExtraOptions"
    val sqlDwUrlSmall = "jdbc:sqlserver://" + dwServer + ":" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass
    
  5. Eseguire il frammento di codice seguente per caricare il dataframe trasformato, renamedColumnsDF, come tabella in Azure Synapse. Il frammento di codice crea una tabella denominata SampleTable nel database SQL.

    spark.conf.set(
        "spark.sql.parquet.writeLegacyFormat",
        "true")
    
    renamedColumnsDF.write.format("com.databricks.spark.sqldw").option("url", sqlDwUrlSmall).option("dbtable", "SampleTable")       .option( "forward_spark_azure_storage_credentials","True").option("tempdir", tempDir).mode("overwrite").save()
    

    Nota

    Questo esempio usa il flag forward_spark_azure_storage_credentials, che fa sì che Azure Synapse acceda ai dati dall'archiviazione BLOB tramite una chiave di accesso. Questo è l'unico metodo di autenticazione supportato.

    Se l'archiviazione BLOB di Azure è limitata alla selezione di reti virtuali, Azure Synapse richiede l'identità del servizio gestita anziché le chiavi di accesso. Questo comportamento provoca l'errore "This request is not authorized to perform this operation" (La richiesta non è autorizzata a eseguire questa operazione).

  6. Connettersi al database SQL e verificare che sia visualizzato un database denominato SampleTable.

    Verify the sample table

  7. Eseguire una query selezionata per verificare i contenuti della tabella. Dovrebbe includere gli stessi dati del dataframe renamedColumnsDf.

    Verify the sample table content

Pulire le risorse

Dopo aver concluso l'esercitazione è possibile terminare il cluster. Nell'area di lavoro di Azure Databricks selezionare Clusters a sinistra. Per terminare il cluster, in Actions (Azioni) selezionare i puntini di sospensione (...) e quindi l'icona Terminate (Terminate).

Stop a Databricks cluster

Se non si termina manualmente il cluster, il cluster viene arrestato automaticamente, purché sia stata selezionata la casella di controllo Terminate after __ minutes of inactivity (Termina dopo __ minuti di inattività ) al momento della creazione del cluster. In tal caso, il cluster viene automaticamente arrestato se è rimasto inattivo per il tempo specificato.

Passaggi successivi

Questa esercitazione ha descritto come:

  • Creare un servizio Azure Databricks
  • Creare un cluster Spark in Azure Databricks
  • Creare un notebook in Azure Databricks
  • Estrarre i dati da un account Data Lake Storage Gen2
  • Trasformare dati in Azure Databricks
  • Caricare i dati in Azure Synapse