Tutoriel : Extraire, transformer et charger des données à l’aide d’Azure Databricks

Dans ce tutoriel, vous allez effectuer une opération ETL (extraction, transformation et chargement de données) à l’aide d’Azure Databricks. Vous extrayez des données d’Azure Data Lake Storage Gen2 dans Azure Databricks, vous exécutez des transformations sur les données dans Azure Databricks, puis vous chargez les données transformées dans Azure Synapse Analytics.

Les étapes décrites dans ce tutoriel utilisent le connecteur Azure Synapse pour Azure Databricks afin de transférer des données à Azure Databricks. Ce connecteur utilise ensuite le Stockage Blob Azure comme stockage temporaire pour les données transférées entre un cluster Azure Databricks et Azure Synapse.

L’illustration suivante montre le flux d’application :

Azure Databricks with Data Lake Store and Azure Synapse

Ce tutoriel décrit les tâches suivantes :

  • Créez un service Azure Databricks.
  • Créer un cluster Spark dans Azure Databricks.
  • Créer un système de fichiers dans le compte Data Lake Storage Gen2.
  • Chargez des exemples de données dans le compte Azure Data Lake Storage Gen2.
  • Créer un principal de service.
  • Extraire les données du compte Azure Data Lake Storage Gen2.
  • Transformer des données dans Azure Databricks.
  • Charger des données dans Azure Synapse.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Notes

Ce didacticiel ne peut pas être suivi avec un abonnement d’essai gratuit Azure. Si vous avez un compte gratuit, accédez à votre profil et modifiez votre abonnement sur Paiement à l’utilisation. Pour plus d’informations, consultez la page Compte Azure gratuit. Ensuite, supprimez la limite de dépense, et demandez une augmentation du quota pour les processeurs virtuels dans votre région. Lorsque vous créez votre espace de travail Azure Databricks, vous pouvez sélectionner le tarif Version d’évaluation (Premium - 14 jours de DBU offerts) pour donner à l’accès de l’espace de travail un accès gratuit aux DBU d’Azure Databricks pendant 14 jours.

Prérequis

Avant de commencer ce tutoriel, effectuez les tâches suivantes :

Collecter les informations dont vous avez besoin

Vérifiez que vous remplissez les prérequis de ce tutoriel.

Avant de commencer, vous devez disposer des informations suivantes :

✔️ Nom de la base de données, nom du serveur de base de données, nom d’utilisateur et mot de passe de votre instance Azure Synapse.

✔️ Clé d’accès associée à votre compte de stockage d’objets blob.

✔️ Nom de votre compte de stockage Data Lake Storage Gen2.

✔️ ID de locataire de votre abonnement.

✔️ ID de l’application que vous avez inscrite auprès de Microsoft Entra ID (anciennement Azure Active Directory).

✔️ ID de la clé d’authentification pour l’application que vous avez inscrite auprès de Microsoft Entra ID (anciennement Azure Active Directory).

Créer un service Azure Databricks

Dans cette section, vous créez un service Azure Databricks en utilisant le portail Azure.

  1. Dans le menu du Portail Azure, sélectionnez Créer une ressource.

    Create a resource on Azure portal

    Sélectionnez ensuite Analytics>Azure Databricks.

    Create Azure Databricks on Azure portal

  2. Sous Service Azure Databricks, renseignez les valeurs suivantes pour créer un service Databricks :

    Propriété Description
    Nom de l’espace de travail Fournissez un nom pour votre espace de travail Databricks.
    Abonnement Sélectionnez votre abonnement Azure dans la liste déroulante.
    Groupe de ressources Indiquez si vous souhaitez créer un groupe de ressources Azure ou utiliser un groupe existant. Un groupe de ressources est un conteneur réunissant les ressources associées d’une solution Azure. Pour plus d’informations, consultez Présentation des groupes de ressources Azure.
    Lieu Sélectionnez USA Ouest 2. Pour les autres régions disponibles, consultez Disponibilité des services Azure par région.
    Niveau tarifaire Sélectionnez Standard.
  3. La création du compte prend quelques minutes. Pour superviser l’état de l’opération, regardez la barre de progression située en haut.

  4. Sélectionnez Épingler au tableau de bord, puis sélectionnez Créer.

Créer un cluster Spark dans Azure Databricks

  1. Dans le portail Azure, accédez au service Databricks que vous avez créé, puis sélectionnez Initialiser l’espace de travail.

  2. Vous êtes redirigé vers le portail Azure Databricks. Dans le portail, sélectionnez Cluster.

    Databricks on Azure

  3. Dans la page Nouveau cluster, renseignez les valeurs pour créer un cluster.

    Create Databricks Spark cluster on Azure

  4. Renseignez les champs suivants et acceptez les valeurs par défaut pour les autres champs :

    • Entrez un nom pour le cluster.

    • Veillez à activer la case à cocher Arrêter après __ minutes d’inactivité. Si le cluster n’est pas utilisé, indiquez une durée (en minutes) pour arrêter le cluster.

    • Sélectionnez Créer un cluster. Une fois que le cluster est en cours d’exécution, vous pouvez y attacher des notebooks et exécuter des travaux Spark.

Créer un système de fichiers dans le compte Azure Data Lake Storage Gen2

Dans cette section, vous créez un bloc-notes dans l’espace de travail Azure Databricks, puis vous exécutez des extraits de code pour configurer le compte de stockage

  1. Dans le portail Azure, accédez au service Azure Databricks que vous avez créé, puis sélectionnez Initialiser l’espace de travail.

  2. À gauche, sélectionnez Espace de travail. Dans la liste déroulante Espace de travail, sélectionnez Créer>Notebook.

    Create a notebook in Databricks

  3. Dans la boîte de dialogue Créer un bloc-notes, entrez un nom pour le bloc-notes. Sélectionnez Scala comme langage, puis sélectionnez le cluster Spark que vous avez créé précédemment.

    Provide details for a notebook in Databricks

  4. Cliquez sur Créer.

  5. Le bloc de code suivant définit les informations d’identification par défaut du principal de service pour tout compte ADLS Gen 2 sollicité dans la session Spark. Le deuxième bloc de code ajoute le nom du compte au paramètre afin de spécifier les informations d’identification pour un compte ADLS Gen 2 spécifique. Copiez et collez l’un ou l’autre bloc de code dans la première cellule de votre bloc-notes Azure Databricks.

    Configuration de session

    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")
    

    Configuration du compte

    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. Dans ce bloc de code, remplacez les valeurs d’espace réservé <app-id>, <secret>, <tenant-id> et <storage-account-name> par celles que vous avez collectées au moment de la finalisation des prérequis de ce tutoriel. Remplacez la valeur d’espace réservé <file-system-name> par le nom de système de fichiers de votre choix.

    • <app-id> et <secret> proviennent de l’application que vous avez inscrite auprès d’Active Directory dans le cadre de la création d’un principal de service.

    • <tenant-id> provient de votre abonnement.

    • <storage-account-name> est le nom de votre compte de stockage Azure Data Lake Storage Gen2.

  7. Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.

Ingérer des exemples de données dans le compte Azure Data Lake Storage Gen2

Avant de commencer cette section, vous devez effectuer les prérequis suivants :

Entrez le code suivant dans une cellule du bloc-notes :

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

Dans la cellule, appuyez sur Maj+Entrée pour exécuter le code.

À présent, dans une nouvelle cellule en dessous de celle-ci, entrez le code suivant et remplacez les valeurs entre crochets par les valeurs que vous avez utilisées plus tôt :

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

Dans la cellule, appuyez sur Maj+Entrée pour exécuter le code.

Extraire les données du compte Azure Data Lake Storage Gen2

  1. Vous pouvez maintenant charger l’exemple de fichier JSON en tant que trame de données dans Azure Databricks. Collez le code suivant dans une nouvelle cellule. Remplacez les espaces réservés indiqués entre crochets par vos valeurs.

    val df = spark.read.json("abfss://" + fileSystemName + "@" + storageAccountName + ".dfs.core.windows.net/small_radio_json.json")
    
  2. Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.

  3. Exécutez le code suivant pour voir le contenu du dataframe :

    df.show()
    

    Le résultat ressemble à ce qui suit :

    +---------------------+---------+---------+------+-------------+----------+---------+-------+--------------------+------+--------+-------------+---------+--------------------+------+-------------+------+
    |               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|
    ...
    ...
    

    Vous avez extrait les données d’Azure Data Lake Storage Gen2 dans Azure Databricks.

Transformer des données dans Azure Databricks

Le fichier brut de l’exemple de données small_radio_json.json capture l’audience d’une station de radio et présente différentes colonnes. Dans cette section, vous transformez les données pour récupérer uniquement des colonnes spécifiques du jeu de données.

  1. Tout d’abord, récupérez uniquement les colonnes firstName, lastName, gender, location et level du dataframe que vous avez créé.

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

    Vous recevez une sortie similaire à l’extrait de code suivant :

    +---------+----------+------+--------------------+-----+
    |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. Vous pouvez transformer ces données pour renommer la colonne level en subscription_type.

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

    Vous recevez une sortie similaire à l’extrait de code suivant.

    +---------+----------+------+--------------------+-----------------+
    |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|
    +---------+----------+------+--------------------+-----------------+
    

Charger des données dans Azure Synapse

Dans cette section, vous chargez les données transformées dans Azure Synapse. Vous utilisez le connecteur Azure Synapse pour Azure Databricks afin de charger directement un dataframe sous forme de table dans un pool Synapse Spark.

Comme mentionné précédemment, le connecteur Azure Synapse utilise le Stockage Blob Azure comme stockage temporaire pour charger des données entre Azure Databricks et Azure Synapse. Vous commencez donc par fournir la configuration pour vous connecter au compte de stockage. Vous devez déjà avoir créé le compte pour les prérequis de cet article.

  1. Fournissez la configuration pour accéder au compte de Stockage Azure à partir d’Azure Databricks.

    val blobStorage = "<blob-storage-account-name>.blob.core.windows.net"
    val blobContainer = "<blob-container-name>"
    val blobAccessKey =  "<access-key>"
    
  2. Spécifiez un dossier temporaire à utiliser lors du déplacement des données entre Azure Databricks et Azure Synapse.

    val tempDir = "wasbs://" + blobContainer + "@" + blobStorage +"/tempDirs"
    
  3. Exécutez l’extrait de code suivant pour stocker les clés d’accès du Stockage Blob Azure dans la configuration. Cette action vous dispense d’avoir à conserver la clé d’accès dans le notebook en texte brut.

    val acntInfo = "fs.azure.account.key."+ blobStorage
    sc.hadoopConfiguration.set(acntInfo, blobAccessKey)
    
  4. Indiquez les valeurs pour vous connecter à l’instance Azure Synapse. Vous devez au préalable avoir créé un service Azure Synapse Analytics. Utilisez le nom complet du serveur pour dwServer. Par exemple : <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. Exécutez l’extrait de code suivant pour charger le dataframe transformé, renamedColumnsDF, en tant que table dans Azure Synapse. Cet extrait de code crée une table appelée SampleTable dans la base de données 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()
    

    Notes

    Cet exemple utilise l’indicateur forward_spark_azure_storage_credentials, qui fait en sorte qu’Azure Synapse accède aux données à partir du stockage d’objets blob à l’aide d’une clé d’accès. Il s’agit de la seule méthode d’authentification prise en charge.

    Si votre Stockage Blob Azure est limité à certains réseaux virtuels, Azure Synapse nécessite Managed Service Identity plutôt que des clés d’accès. Cela génère l’erreur « Cette requête n’est pas autorisée à effectuer cette opération ».

  6. Connectez-vous à la base de données SQL et vérifiez que vous y voyez une base de données nommée SampleTable.

    Verify the sample table

  7. Exécutez une requête SELECT pour vérifier le contenu de la table. Celle-ci doit avoir les mêmes données que celles présentes dans le dataframe renamedColumnsDf.

    Verify the sample table content

Nettoyer les ressources

Une fois que vous avez terminé le tutoriel, vous pouvez terminer le cluster. Dans l’espace de travail Azure Databricks, sélectionnez Clusters à gauche. Pour terminer le cluster, sous Actions, pointez sur les points de suspension (...) et sélectionnez l’icône Terminer.

Stop a Databricks cluster

Si vous ne terminez pas le cluster manuellement, il s’arrête automatiquement, à condition d’avoir coché la case Arrêter après __ minutes d’inactivité lors de la création du cluster. Dans ce cas, le cluster s’arrête automatiquement s’il a été inactif pendant la période renseignée.

Étapes suivantes

Dans ce didacticiel, vous avez appris à :

  • Créer un service Azure Databricks
  • Créer un cluster Spark dans Azure Databricks
  • Créer un notebook dans Azure Databricks
  • Extraire les données d’un compte Data Lake Storage Gen2
  • Transformer des données dans Azure Databricks
  • Charger des données dans Azure Synapse