Självstudie: Implementera datasjöinfångstmönstret för att uppdatera en Databricks Delta-tabell
Den här självstudien visar hur du hanterar händelser i ett lagringskonto som har en hierarkisk namnrymd.
Du skapar en liten lösning som gör att en användare kan fylla i en Databricks Delta-tabell genom att ladda upp en fil med kommaavgränsade värden (csv) som beskriver en försäljningsorder. Du skapar den här lösningen genom att koppla samman en Event Grid-prenumeration, en Azure-funktion och ett jobb i Azure Databricks.
I de här självstudierna får du:
- Skapa en Event Grid prenumeration som anropar en Azure-funktion.
- Skapa en Azure-funktion som tar emot ett meddelande från en händelse och sedan kör jobbet i Azure Databricks.
- Skapa ett Databricks-jobb som infogar en kundorder i en Databricks Delta-tabell som finns i lagringskontot.
Vi skapar den här lösningen i omvänd ordning, från och med Azure Databricks arbetsyta.
Krav
Om du inte har en Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
Skapa ett lagringskonto som har ett hierarkiskt namnområde (Azure Data Lake Storage Gen2). I den här självstudien används ett lagringskonto med namnet
contosoorders. Se till att ditt användarkonto har tilldelats rollen Storage Blob Data-deltagare.Se Skapa ett lagringskonto som ska användas med Azure Data Lake Storage Gen2.
Skapa ett huvudnamn för tjänsten. Se Gör så här: Använd portalen för att skapa ett Azure AD-program och tjänstens huvudnamn som kan komma åt resurser.
Det finns några saker som du måste göra när du utför stegen i den här artikeln.
✔️ När du utför stegen i avsnittet Tilldela programmet till en roll i artikeln måste du tilldela rollen Storage Blob Data-deltagare till tjänstens huvudnamn.
Viktigt
Se till att tilldela rollen i omfånget för Data Lake Storage Gen2-lagringskontot. Du kan tilldela en roll till den överordnade resursgruppen eller prenumerationen, men du får behörighetsrelaterade fel tills de rolltilldelningarna propageras till lagringskontot.
✔️ När du utför stegen i avsnittet Hämta värden för inloggning i artikeln klistrar du in värdena för klient-ID, app-ID och lösenord i en textfil. Du behöver dessa värden senare.
Skapa en försäljningsorder
Skapa först en csv-fil som beskriver en försäljningsorder och ladda sedan upp filen till lagringskontot. Senare kommer du att använda data från den här filen för att fylla i den första raden i vår Databricks Delta-tabell.
Öppna Azure Storage Explorer. Gå sedan till ditt lagringskonto och skapa en ny container med namnet data i avsnittet Blobcontainrar.

Mer information om hur du använder Storage Explorer finns i Använda Azure Storage Explorer för att hantera data i ett Azure Data Lake Storage Gen2-konto.
I datacontainern skapar du en mapp med namnet input.
Klistra in följande text i en textredigerare.
InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country 536365,85123A,WHITE HANGING HEART T-LIGHT HOLDER,6,12/1/2010 8:26,2.55,17850,United KingdomSpara den här filen på den lokala datorn och ge den namnet data.csv.
I Storage Explorer du den här filen till indatamappen.
Skapa ett jobb i Azure Databricks
I det här avsnittet ska du utföra följande uppgifter:
- Skapa en Azure Databricks-arbetsyta.
- Skapa en anteckningsbok.
- Skapa och fylla i en Databricks Delta-tabell.
- Lägg till kod som infogar rader i Databricks Delta-tabellen.
- Skapa ett jobb.
Skapa en Azure Databricks-arbetsyta
I det här avsnittet skapar du en Azure Databricks-arbetsyta med Azure-portalen.
I den Azure Portal väljer du Skapa en resurs Analytics > > Azure Databricks.

Under Azure Databricks-tjänst anger du värden för att skapa en Databricks-arbetsyta.

Det tar några minuter att skapa arbetsytan. Du kan övervaka åtgärdsstatusen i förloppsindikatorn längst upp.
Skapa ett Spark-kluster i Databricks
I Azure Portaldu till arbetsytan Azure Databricks som du skapade och väljer sedan Starta arbetsyta.
Du omdirigeras till Azure Databricks-portalen. Från portalen väljer du Nytt > kluster.

På sidan Nytt kluster anger du värdena för att skapa ett kluster.

Godkänn alla övriga standardvärden, förutom följande:
- Ange ett namn för klustret.
- Se till att markera kryssrutan Avsluta efter 120 minuters inaktivitet. Ange en varaktighet (i minuter) för att avsluta klustret om klustret inte används.
Välj Skapa kluster. När klustret körs kan du ansluta anteckningsböcker till klustret och köra Spark-jobb.
Mer information om att skapa kluster finns i Skapa ett Spark-kluster i Azure Databricks.
Skapa en notebook-fil
Välj Arbetsyta i det vänstra fönstret. I listrutan Arbetsyta väljer du Skapa > Anteckningsbok.

Ge anteckningsboken ett namn i dialogrutan Skapa anteckningsbok. Välj Python som språk och välj sedan det Spark-kluster du skapade tidigare.

Välj Skapa.
Skapa och fylla i en Databricks Delta-tabell
I anteckningsboken som du skapade kopierar och klistrar du in följande kodblock i den första cellen, men kör inte den här koden ännu.
Ersätt platshållarvärdena , , i det här kodblocket med de värden som du samlade in
appIdpasswordnär dutenantslutförde förutsättningarna för den här självstudien.dbutils.widgets.text('source_file', "", "Source File") 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", "<password>") spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<tenant>/oauth2/token") adlsPath = 'abfss://data@contosoorders.dfs.core.windows.net/' inputPath = adlsPath + dbutils.widgets.get('source_file') customerTablePath = adlsPath + 'delta-tables/customers'Den här koden skapar en widget med namnet source_file. Senare skapar du en Azure-funktion som anropar den här koden och skickar en filsökväg till widgeten. Den här koden autentiserar även tjänstens huvudnamn med lagringskontot och skapar några variabler som du använder i andra celler.
Anteckning
I en produktionsinställning bör du överväga att lagra din autentiseringsnyckel i Azure Databricks. Sedan lägger du till en lookup-nyckel i kodblocket i stället för autentiseringsnyckeln.
I stället för att till exempel använda den här kodraden:spark.conf.set("fs.azure.account.oauth2.client.secret", "<password>")använder du följande kodrad:spark.conf.set("fs.azure.account.oauth2.client.secret", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>")).
När du har slutfört den här självstudien kan du läsa artikeln Azure Data Lake Storage Gen2 på Azure Databricks webbplats för att se exempel på den här metoden.Tryck på SKIFT + RETUR för att köra koden i det här blocket.
Kopiera och klistra in följande kodblock i en annan cell och tryck sedan på tangenterna SKIFT + RETUR för att köra koden i det här blocket.
from pyspark.sql.types import StructType, StructField, DoubleType, IntegerType, StringType inputSchema = StructType([ StructField("InvoiceNo", IntegerType(), True), StructField("StockCode", StringType(), True), StructField("Description", StringType(), True), StructField("Quantity", IntegerType(), True), StructField("InvoiceDate", StringType(), True), StructField("UnitPrice", DoubleType(), True), StructField("CustomerID", IntegerType(), True), StructField("Country", StringType(), True) ]) rawDataDF = (spark.read .option("header", "true") .schema(inputSchema) .csv(adlsPath + 'input') ) (rawDataDF.write .mode("overwrite") .format("delta") .saveAsTable("customer_data", path=customerTablePath))Den här koden skapar Databricks Delta-tabellen i ditt lagringskonto och läser sedan in vissa inledande data från csv-filen som du laddade upp tidigare.
När det här kodblocket har körs tar du bort det här kodblocket från notebook-datorn.
Lägg till kod som infogar rader i Databricks Delta-tabellen
Kopiera och klistra in följande kodblock i en annan cell, men kör inte den här cellen.
upsertDataDF = (spark .read .option("header", "true") .csv(inputPath) ) upsertDataDF.createOrReplaceTempView("customer_data_to_upsert")Den här koden infogar data i en tillfällig tabellvy med hjälp av data från en csv-fil. Sökvägen till csv-filen kommer från den indatawidget som du skapade i ett tidigare steg.
Lägg till följande kod för att sammanfoga innehållet i den tillfälliga tabellvyn med Databricks Delta-tabellen.
%sql MERGE INTO customer_data cd USING customer_data_to_upsert cu ON cd.CustomerID = cu.CustomerID WHEN MATCHED THEN UPDATE SET cd.StockCode = cu.StockCode, cd.Description = cu.Description, cd.InvoiceNo = cu.InvoiceNo, cd.Quantity = cu.Quantity, cd.InvoiceDate = cu.InvoiceDate, cd.UnitPrice = cu.UnitPrice, cd.Country = cu.Country WHEN NOT MATCHED THEN INSERT (InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID, Country) VALUES ( cu.InvoiceNo, cu.StockCode, cu.Description, cu.Quantity, cu.InvoiceDate, cu.UnitPrice, cu.CustomerID, cu.Country)
Skapa ett jobb
Skapa ett jobb som kör anteckningsboken som du skapade tidigare. Senare ska du skapa en Azure-funktion som kör det här jobbet när en händelse utlöses.
Klicka på Jobb.
På sidan Jobb klickar du på Skapa jobb.
Ge jobbet ett namn och välj sedan
upsert-order-dataarbetsboken.
Skapa en Azure-funktion
Skapa en Azure-funktion som kör jobbet.
I det övre hörnet av Databricks-arbetsytan väljer du ikonen Personer och sedan Användarinställningar.

Klicka på knappen Generera ny token och klicka sedan på knappen Generera.
Se till att kopiera token till en säker plats. Din Azure-funktion behöver den här token för att autentisera med Databricks så att den kan köra jobbet.
Välj knappen Skapa en resurs längst upp till vänster i Azure Portal och välj sedan Compute > Function App.

På sidan Skapa i funktionsappen väljer du .NET Core för körningsstacken och konfigurerar en Application Insights-instans.

På sidan Översikt i funktionsappen klickar du på Konfiguration.

På sidan Inställningar program väljer du knappen Ny programinställning för att lägga till varje inställning.

Lägg till följande inställningar:
Inställningsnamn Värde DBX_INSTANCE Regionen för databricks-arbetsytan. Exempelvis: westus2.azuredatabricks.netDBX_PAT Den personliga åtkomsttoken som du genererade tidigare. DBX_JOB_ID Identifieraren för det jobb som körs. I vårt fall är det här värdet 1.På översiktssidan för funktionsappen klickar du på knappen Ny funktion.

Välj Azure Event Grid Utlösare.
Installera tillägget Microsoft.Azure.WebJobs.Extensions.EventGrid om du uppmanas att göra det. Om du måste installera det måste du välja utlösare Azure Event Grid för att skapa funktionen.
Fönstret Ny funktion visas.
I fönstret Ny funktion ger du funktionen namnet UpsertOrder och klickar sedan på knappen Skapa.
Ersätt innehållet i kodfilen med den här koden och klicka sedan på knappen Spara:
using "Microsoft.Azure.EventGrid" using "Newtonsoft.Json" using Microsoft.Azure.EventGrid.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; private static HttpClient httpClient = new HttpClient(); public static async Task Run(EventGridEvent eventGridEvent, ILogger log) { log.LogInformation("Event Subject: " + eventGridEvent.Subject); log.LogInformation("Event Topic: " + eventGridEvent.Topic); log.LogInformation("Event Type: " + eventGridEvent.EventType); log.LogInformation(eventGridEvent.Data.ToString()); if (eventGridEvent.EventType == "Microsoft.Storage.BlobCreated" | | eventGridEvent.EventType == "Microsoft.Storage.FileRenamed") { var fileData = ((JObject)(eventGridEvent.Data)).ToObject<StorageBlobCreatedEventData>(); if (fileData.Api == "FlushWithClose") { log.LogInformation("Triggering Databricks Job for file: " + fileData.Url); var fileUrl = new Uri(fileData.Url); var httpRequestMessage = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri(String.Format("https://{0}/api/2.0/jobs/run-now", System.Environment.GetEnvironmentVariable("DBX_INSTANCE", EnvironmentVariableTarget.Process))), Headers = { { System.Net.HttpRequestHeader.Authorization.ToString(), "Bearer " + System.Environment.GetEnvironmentVariable ("DBX_PAT", EnvironmentVariableTarget.Process)}, { System.Net.HttpRequestHeader.ContentType.ToString (), "application/json" } }, Content = new StringContent(JsonConvert.SerializeObject(new { job_id = System.Environment.GetEnvironmentVariable ("DBX_JOB_ID", EnvironmentVariableTarget.Process) , notebook_params = new { source_file = String.Join("", fileUrl.Segments.Skip(2)) } })) }; var response = await httpClient.SendAsync(httpRequestMessage); response.EnsureSuccessStatusCode(); } } }
Den här koden parsar information om lagringshändelsen som utlöstes och skapar sedan ett meddelande om begäran med URL:en för den fil som utlöste händelsen. Som en del av meddelandet skickar funktionen ett värde till den source_file widget som du skapade tidigare. funktionskoden skickar meddelandet till Databricks-jobbet och använder den token som du fick tidigare som autentisering.
Skapa en Event Grid-prenumeration
I det här avsnittet skapar du en Event Grid som anropar Azure-funktionen när filer laddas upp till lagringskontot.
På funktionskodsidan klickar du på knappen Lägg till Event Grid prenumeration.

På sidan Skapa händelseprenumeration ger du prenumerationen ett namn och använder sedan fälten på sidan för att välja ditt lagringskonto.

I listrutan Filter to Event Types (Filtrera till händelsetyper) väljer du Händelserna Blob Created (Blob har skapats) och Blob Deleted (Borttagna blobar) och klickar sedan på knappen Skapa.
Testa Event Grid prenumeration
Skapa en fil med
customer-order.csvnamnet , klistra in följande information i filen och spara den på den lokala datorn.InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country 536371,99999,EverGlow Single,228,1/1/2018 9:01,33.85,20993,Sierra LeoneI Storage Explorer du den här filen till indatamappen för ditt lagringskonto.
När du laddar upp en fil höjs Microsoft.Storage. BlobCreated-händelse. Event Grid meddelar alla prenumeranter om händelsen. I vårt fall är Azure-funktionen den enda prenumeranten. Azure-funktionen parsar händelseparametrarna för att avgöra vilken händelse som inträffade. Den skickar sedan filens URL till Databricks-jobbet. Databricks-jobbet läser filen och lägger till en rad i Databricks Delta-tabellen som finns på ditt lagringskonto.
Om du vill kontrollera om jobbet lyckades öppnar du databricks-arbetsytan, klickar på knappen Jobb och öppnar sedan jobbet.
Välj jobbet för att öppna jobbsidan.

När jobbet har slutförts visas slutförandestatusen.

I en ny arbetsbokscell kör du den här frågan i en cell för att se den uppdaterade deltatabellen.
%sql select * from customer_dataDen returnerade tabellen visar den senaste posten.

Om du vill uppdatera den här posten skapar du en fil med namnet , klistrar in följande information i filen
customer-order-update.csvoch sparar den på den lokala datorn.InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country 536371,99999,EverGlow Single,22,1/1/2018 9:01,33.85,20993,Sierra LeoneDen här csv-filen är nästan identisk med den tidigare, förutom att orderkvantiteten ändras från
228till22.I Storage Explorer du den här filen till indatamappen för ditt lagringskonto.
Kör frågan
selectigen för att se den uppdaterade deltatabellen.%sql select * from customer_dataDen returnerade tabellen visar den uppdaterade posten.

Rensa resurser
Ta bort resursgruppen och alla relaterade resurser när de inte längre behövs. Det gör du genom att välja resursgruppen för lagringskontot och sedan Ta bort.