Dela via


Självstudie: Indexera stora data från Apache Spark med SynapseML och Azure AI Search

I den här självstudien om Azure AI Search lär du dig att indexeras och köra frågor mot stora data som läses in från ett Spark-kluster. Konfigurera en Jupyter Notebook som utför följande åtgärder:

  • Läsa in olika formulär (fakturor) i en dataram i en Apache Spark-session
  • Analysera dem för att fastställa deras funktioner
  • Montera de resulterande utdata i en tabelldatastruktur
  • Skriva utdata till ett sökindex som finns i Azure AI Search
  • Utforska och fråga efter innehållet du skapade

Den här självstudien är beroende av SynapseML, ett bibliotek med öppen källkod som stöder massivt parallell maskininlärning över stordata. I SynapseML exponeras sökindexering och maskininlärning via transformatorer som utför specialiserade uppgifter. Transformatorer utnyttjar ett brett utbud av AI-funktioner. I den här övningen använder du Api:erna för AzureSearchWriter för analys och AI-berikning.

Även om Azure AI Search har inbyggd AI-berikning visar den här självstudien hur du kommer åt AI-funktioner utanför Azure AI Search. Genom att använda SynapseML i stället för indexerare eller färdigheter omfattas du inte av datagränser eller andra begränsningar som är associerade med dessa objekt.

Dricks

Titta på en kort video av den här demonstrationen på https://www.youtube.com/watch?v=iXnBLwp7f88. Videon utökar den här självstudien med fler steg och visuella objekt.

Förutsättningar

Du behöver synapseml biblioteket och flera Azure-resurser. Använd om möjligt samma prenumeration och region för dina Azure-resurser och placera allt i en resursgrupp för enkel rensning senare. Följande länkar är för portalinstallationer. Exempeldata importeras från en offentlig webbplats.

1 Den här länken matchar en självstudiekurs för att läsa in paketet.

2 Du kan använda den kostnadsfria söknivån för att indexera exempeldata, men välja en högre nivå om dina datavolymer är stora. För fakturerbara nivåer anger du sök-API-nyckeln i steget Konfigurera beroenden längre fram.

3 I den här självstudien används Azure AI Document Intelligence och Azure AI Translator. I anvisningarna nedan anger du en nyckel för flera tjänster och regionen. Samma nyckel fungerar för båda tjänsterna.

4 I den här självstudien tillhandahåller Azure Databricks Spark-databehandlingsplattformen. Vi använde portalinstruktionerna för att konfigurera arbetsytan.

Kommentar

Alla ovanstående Azure-resurser har stöd för säkerhetsfunktioner i Microsoft Identity-plattformen. För enkelhetens skull förutsätter den här självstudien nyckelbaserad autentisering med hjälp av slutpunkter och nycklar som kopieras från portalsidorna för varje tjänst. Om du implementerar det här arbetsflödet i en produktionsmiljö eller delar lösningen med andra ska du komma ihåg att ersätta hårdkodade nycklar med integrerade säkerhetsnycklar eller krypterade nycklar.

Steg 1: Skapa ett Spark-kluster och en notebook-fil

I det här avsnittet skapar du ett kluster, installerar synapseml biblioteket och skapar en notebook-fil för att köra koden.

  1. Leta reda på din Azure Databricks-arbetsyta i Azure-portalen och välj Starta arbetsyta.

  2. Välj Beräkning på den vänstra menyn.

  3. Välj Skapa beräkning.

  4. Acceptera standardkonfigurationen. Det tar flera minuter att skapa klustret.

  5. synapseml Installera biblioteket när klustret har skapats:

    1. Välj Bibliotek på flikarna överst på klustrets sida.

    2. Välj Installera ny.

      Skärmbild av kommandot Installera ny.

    3. Välj Maven.

    4. I Koordinater anger du com.microsoft.azure:synapseml_2.12:1.0.4

    5. Välj Installera.

      Skärmbild av Maven-paketspecifikationen.

  6. Välj Skapa>anteckningsbok på den vänstra menyn.

    Skärmbild av kommandot Skapa anteckningsbok.

  7. Ge anteckningsboken ett namn, välj Python som standardspråk och välj det kluster som har synapseml biblioteket.

  8. Skapa sju celler i följd. Klistra in kod i var och en.

    Skärmbild av anteckningsboken med platshållarceller.

Steg 2: Konfigurera beroenden

Klistra in följande kod i den första cellen i anteckningsboken.

Ersätt platshållarna med slutpunkter och åtkomstnycklar för varje resurs. Ange ett namn för ett nytt sökindex. Inga andra ändringar krävs, så kör koden när du är redo.

Den här koden importerar flera paket och konfigurerar åtkomst till de Azure-resurser som används i det här arbetsflödet.

import os
from pyspark.sql.functions import udf, trim, split, explode, col, monotonically_increasing_id, lit
from pyspark.sql.types import StringType
from synapse.ml.core.spark import FluentAPI

cognitive_services_key = "placeholder-cognitive-services-multi-service-key"
cognitive_services_region = "placeholder-cognitive-services-region"

search_service = "placeholder-search-service-name"
search_key = "placeholder-search-service-api-key"
search_index = "placeholder-search-index-name"

Steg 3: Läsa in data i Spark

Klistra in följande kod i den andra cellen. Inga ändringar krävs, så kör koden när du är redo.

Den här koden läser in några externa filer från ett Azure Storage-konto. Filerna är olika fakturor och de läss in i en dataram.

def blob_to_url(blob):
    [prefix, postfix] = blob.split("@")
    container = prefix.split("/")[-1]
    split_postfix = postfix.split("/")
    account = split_postfix[0]
    filepath = "/".join(split_postfix[1:])
    return "https://{}/{}/{}".format(account, container, filepath)


df2 = (spark.read.format("binaryFile")
    .load("wasbs://ignite2021@mmlsparkdemo.blob.core.windows.net/form_subset/*")
    .select("path")
    .limit(10)
    .select(udf(blob_to_url, StringType())("path").alias("url"))
    .cache())
    
display(df2)

Steg 4: Lägga till dokumentinformation

Klistra in följande kod i den tredje cellen. Inga ändringar krävs, så kör koden när du är redo.

Den här koden läser in AnalyzeInvoices-transformatorn och skickar en referens till dataramen som innehåller fakturorna. Den anropar den fördefinierade fakturamodellen för Azure AI Document Intelligence för att extrahera information från fakturorna.

from synapse.ml.cognitive import AnalyzeInvoices

analyzed_df = (AnalyzeInvoices()
    .setSubscriptionKey(cognitive_services_key)
    .setLocation(cognitive_services_region)
    .setImageUrlCol("url")
    .setOutputCol("invoices")
    .setErrorCol("errors")
    .setConcurrency(5)
    .transform(df2)
    .cache())

display(analyzed_df)

Utdata från det här steget bör se ut ungefär som nästa skärmbild. Observera hur formuläranalysen är packad i en tätt strukturerad kolumn, vilket är svårt att arbeta med. Nästa omvandling löser det här problemet genom att parsa kolumnen i rader och kolumner.

Skärmbild av AnalyzeInvoices-utdata.

Steg 5: Omstrukturera dokumentinformationsutdata

Klistra in följande kod i den fjärde cellen och kör den. Inga ändringar krävs.

Den här koden läser in FormOntologyLearner, en transformerare som analyserar utdata från Transformatorer för dokumentinformation och härleder en tabelldatastruktur. Utdata från AnalyzeInvoices är dynamiska och varierar beroende på vilka funktioner som identifieras i ditt innehåll. Dessutom konsoliderar transformatorn utdata till en enda kolumn. Eftersom utdata är dynamiska och konsoliderade är det svårt att använda i nedströmstransformeringar som kräver mer struktur.

FormOntologyLearner utökar verktyget för AnalyzeInvoices-transformatorn genom att söka efter mönster som kan användas för att skapa en tabelldatastruktur. Genom att ordna utdata i flera kolumner och rader blir innehållet förbrukningsbart i andra transformatorer, till exempel AzureSearchWriter.

from synapse.ml.cognitive import FormOntologyLearner

itemized_df = (FormOntologyLearner()
    .setInputCol("invoices")
    .setOutputCol("extracted")
    .fit(analyzed_df)
    .transform(analyzed_df)
    .select("url", "extracted.*").select("*", explode(col("Items")).alias("Item"))
    .drop("Items").select("Item.*", "*").drop("Item"))

display(itemized_df)

Observera hur den här omvandlingen omarbetar de kapslade fälten till en tabell, vilket möjliggör de kommande två omvandlingarna. Den här skärmbilden är trimmad för korthet. Om du följer med i din egen notebook-fil har du 19 kolumner och 26 rader.

Skärmbild av FormOntologyLearner-utdata.

Steg 6: Lägg till översättningar

Klistra in följande kod i den femte cellen. Inga ändringar krävs, så kör koden när du är redo.

Den här koden läser in Translate, en transformerare som anropar Azure AI Translator-tjänsten i Azure AI-tjänster. Den ursprungliga texten, som är på engelska i kolumnen "Beskrivning", maskinöversätts till olika språk. Alla utdata konsolideras i matrisen "output.translations".

from synapse.ml.cognitive import Translate

translated_df = (Translate()
    .setSubscriptionKey(cognitive_services_key)
    .setLocation(cognitive_services_region)
    .setTextCol("Description")
    .setErrorCol("TranslationError")
    .setOutputCol("output")
    .setToLanguage(["zh-Hans", "fr", "ru", "cy"])
    .setConcurrency(5)
    .transform(itemized_df)
    .withColumn("Translations", col("output.translations")[0])
    .drop("output", "TranslationError")
    .cache())

display(translated_df)

Dricks

Om du vill söka efter översatta strängar bläddrar du till slutet av raderna.

Skärmbild av tabellutdata som visar kolumnen Översättningar.

Steg 7: Lägga till ett sökindex med AzureSearchWriter

Klistra in följande kod i den sjätte cellen och kör den sedan. Inga ändringar krävs.

Den här koden läser in AzureSearchWriter. Den använder en tabelldatauppsättning och härleder ett sökindexschema som definierar ett fält för varje kolumn. Eftersom översättningsstrukturen är en matris artikuleras den i indexet som en komplex samling med underfält för varje språköversättning. Det genererade indexet har en dokumentnyckel och använder standardvärdena för fält som skapats med hjälp av REST-API:et Skapa index.

from synapse.ml.cognitive import *

(translated_df.withColumn("DocID", monotonically_increasing_id().cast("string"))
    .withColumn("SearchAction", lit("upload"))
    .writeToAzureSearch(
        subscriptionKey=search_key,
        actionCol="SearchAction",
        serviceName=search_service,
        indexName=search_index,
        keyCol="DocID",
    ))

Du kan kontrollera söktjänstsidorna i Azure-portalen för att utforska indexdefinitionen som skapats av AzureSearchWriter.

Kommentar

Om du inte kan använda standardsökindex kan du ange en extern anpassad definition i JSON och skicka dess URI som en sträng i egenskapen "indexJson". Generera standardindexet först så att du vet vilka fält som ska anges och följ sedan med anpassade egenskaper om du till exempel behöver specifika analysverktyg.

Steg 8: Fråga indexet

Klistra in följande kod i den sjunde cellen och kör den sedan. Inga ändringar krävs, förutom att du kanske vill variera syntaxen eller prova fler exempel för att utforska innehållet ytterligare:

Det finns ingen transformator eller modul som utfärdar frågor. Den här cellen är ett enkelt anrop till REST API för sökdokument.

Det här exemplet söker efter ordet "dörr" ("search": "door"). Den returnerar också ett "antal" av antalet matchande dokument och väljer bara innehållet i fälten "Beskrivning" och "Översättningar" för resultatet. Om du vill se den fullständiga listan med fält tar du bort parametern "select".

import requests

url = "https://{}.search.windows.net/indexes/{}/docs/search?api-version=2024-07-01".format(search_service, search_index)
requests.post(url, json={"search": "door", "count": "true", "select": "Description, Translations"}, headers={"api-key": search_key}).json()

Följande skärmbild visar cellutdata för exempelskript.

Skärmbild av frågeresultat som visar fälten count, search string och return.

Rensa resurser

När du arbetar i din egen prenumeration i slutet av ett projekt är det en bra idé att ta bort de resurser som du inte längre behöver. Resurser som fortsätter att köras kostar pengar. Du kan ta bort enstaka resurser eller hela resursgruppen om du vill ta bort alla resurser.

Du kan hitta och hantera resurser i portalen med hjälp av länken Alla resurser eller Resursgrupper i det vänstra navigeringsfönstret.

Nästa steg

I den här självstudien har du lärt dig om AzureSearchWriter-transformatorn i SynapseML, vilket är ett nytt sätt att skapa och läsa in sökindex i Azure AI Search. Transformatorn tar strukturerad JSON som indata. FormOntologyLearner kan tillhandahålla den struktur som krävs för utdata som produceras av transformatorerna för dokumentinformation i SynapseML.

Som ett nästa steg går du igenom de andra SynapseML-självstudierna som producerar transformerat innehåll som du kanske vill utforska via Azure AI Search: