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 :
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 :
Créez un Azure Synapse, créez une règle de pare-feu au niveau du serveur et connectez-vous au serveur en tant qu’administrateur de serveur. Consultez Démarrage rapide : Créer et interroger un pool Sql Synapse à l’aide du Portail Azure.
Créez une clé principale pour l’instance Azure Synapse. Consultez Créer une clé principale de base de données.
Créez un compte de stockage Blob Azure et un conteneur dans celui-ci. Récupérez également la clé d’accès au compte de stockage. Consultez Démarrage rapide : Charger, télécharger et répertorier des objets blob à l’aide du portail Azure.
Créez un compte de stockage Azure Data Lake Storage Gen2. Consultez Démarrage rapide : créer un compte de stockage Azure Data Lake Storage Gen2.
Créer un principal de service. Consultez Guide pratique pour utiliser le portail pour créer une application et un principal de service Microsoft Entra ID (anciennement Azure Active Directory) pouvant accéder aux ressources.
Vous devrez faire certaines choses spécifiques pendant que vous suivrez les étapes décrites dans cet article.
Au cours des étapes décrites dans la section Attribuer un rôle à l’application de l’article, veillez à affecter le rôle Contributeur aux données Blob du stockage au principal de service dans l’étendue du compte Data Lake Storage Gen2. Si vous attribuez le rôle à l’abonnement ou au groupe de ressources parent, des erreurs d’autorisation seront générées tant que ces attributions de rôles ne seront pas propagées au compte de stockage.
Si vous préférez utiliser une liste de contrôle d’accès (ACL) pour associer le principal de service à un fichier ou répertoire spécifique, consultez Contrôle d’accès dans Azure Data Lake Storage Gen2.
Au cours des étapes indiquées dans la section Obtenir les valeurs pour la connexion de l’article, collez les valeurs de l’ID de locataire, de l’ID d’application et du secret dans un fichier texte.
Connectez-vous au portail Azure.
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.
Dans le menu du Portail Azure, sélectionnez Créer une ressource.
Sélectionnez ensuite Analytics>Azure Databricks.
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. 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.
Sélectionnez Épingler au tableau de bord, puis sélectionnez Créer.
Créer un cluster Spark dans Azure Databricks
Dans le portail Azure, accédez au service Databricks que vous avez créé, puis sélectionnez Initialiser l’espace de travail.
Vous êtes redirigé vers le portail Azure Databricks. Dans le portail, sélectionnez Cluster.
Dans la page Nouveau cluster, renseignez les valeurs pour créer un cluster.
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
Dans le portail Azure, accédez au service Azure Databricks que vous avez créé, puis sélectionnez Initialiser l’espace de travail.
À gauche, sélectionnez Espace de travail. Dans la liste déroulante Espace de travail, sélectionnez Créer>Notebook.
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.
Cliquez sur Créer.
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")
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.
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
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")
Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.
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.
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| +---------+----------+------+--------------------+-----+
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.
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>"
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"
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)
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
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 ».
Connectez-vous à la base de données SQL et vérifiez que vous y voyez une base de données nommée SampleTable.
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.
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.
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