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.

  1. Öppna Azure Storage Explorer. Gå sedan till ditt lagringskonto och skapa en ny container med namnet data i avsnittet Blobcontainrar.

    datamapp

    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.

  2. I datacontainern skapar du en mapp med namnet input.

  3. 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 Kingdom
    
  4. Spara den här filen på den lokala datorn och ge den namnet data.csv.

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

  1. I den Azure Portal väljer du Skapa en resurs Analytics > > Azure Databricks.

    Databricks på Azure Portal

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

    Skapa en Azure 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

  1. I Azure Portaldu till arbetsytan Azure Databricks som du skapade och väljer sedan Starta arbetsyta.

  2. Du omdirigeras till Azure Databricks-portalen. Från portalen väljer du Nytt > kluster.

    Databricks på Azure

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

    Skapa Databricks Spark-kluster i Azure

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

  1. Välj Arbetsyta i det vänstra fönstret. I listrutan Arbetsyta väljer du Skapa > Anteckningsbok.

    Skapa anteckningsbok i Databricks

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

    Skärmbild som visar dialogrutan Skapa anteckningsbok och var du väljer Python som språk.

    Välj Skapa.

Skapa och fylla i en Databricks Delta-tabell

  1. 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 appId password när du tenant slutfö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.

  2. Tryck på SKIFT + RETUR för att köra koden i det här blocket.

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

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

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

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

  1. Klicka på Jobb.

  2. På sidan Jobb klickar du på Skapa jobb.

  3. Ge jobbet ett namn och välj sedan upsert-order-data arbetsboken.

    Skapa ett jobb

Skapa en Azure-funktion

Skapa en Azure-funktion som kör jobbet.

  1. I det övre hörnet av Databricks-arbetsytan väljer du ikonen Personer och sedan Användarinställningar.

    Hantera kontot

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

  3. Välj knappen Skapa en resurs längst upp till vänster i Azure Portal och välj sedan Compute > Function App.

    Skapa en Azure-funktion

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

    Konfigurera funktionsappen

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

    Skärmbild som visar alternativet Konfiguration under Konfigurerade funktioner.

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

    Lägg till konfigurationsinställning

    Lägg till följande inställningar:

    Inställningsnamn Värde
    DBX_INSTANCE Regionen för databricks-arbetsytan. Exempelvis: westus2.azuredatabricks.net
    DBX_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 .
  7. På översiktssidan för funktionsappen klickar du på knappen Ny funktion.

    Ny funktion

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

  9. I fönstret Ny funktion ger du funktionen namnet UpsertOrder och klickar sedan på knappen Skapa.

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

  1. På funktionskodsidan klickar du på knappen Lägg till Event Grid prenumeration.

    Skärmbild som visar knappen Lägg Event Grid prenumeration.

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

    Ny händelseprenumeration

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

  1. Skapa en fil med customer-order.csv namnet , 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 Leone
    
  2. I 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.

  3. Om du vill kontrollera om jobbet lyckades öppnar du databricks-arbetsytan, klickar på knappen Jobb och öppnar sedan jobbet.

  4. Välj jobbet för att öppna jobbsidan.

    Spark-jobb

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

    Jobbet har slutförts

  5. 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_data
    

    Den returnerade tabellen visar den senaste posten.

    Den senaste posten visas i tabellen

  6. Om du vill uppdatera den här posten skapar du en fil med namnet , klistrar in följande information i filen customer-order-update.csv och 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 Leone
    

    Den här csv-filen är nästan identisk med den tidigare, förutom att orderkvantiteten ändras från 228 till 22 .

  7. I Storage Explorer du den här filen till indatamappen för ditt lagringskonto.

  8. Kör frågan select igen för att se den uppdaterade deltatabellen.

    %sql select * from customer_data
    

    Den returnerade tabellen visar den uppdaterade posten.

    Den uppdaterade posten visas i tabellen

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.

Nästa steg