Samouczek: wyodrębnianie, przekształcanie i ładowanie danych przy użyciu usługi Azure Databricks

W ramach tego samouczka wykonasz operację ETL (wyodrębnianie, przekształcanie i ładowanie danych) przy użyciu usługi Azure Databricks. Wyodrębnianie danych z usługi Azure Data Lake Storage Gen2 do usługi Azure Databricks, uruchamianie przekształceń danych w usłudze Azure Databricks i ładowanie przekształconych danych do usługi Azure Synapse Analytics.

Kroki opisane w tym samouczku używają łącznika usługi Azure Synapse dla usługi Azure Databricks do transferu danych do usługi Azure Databricks. Z kolei ten łącznik używa usługi Azure Blob Storage jako magazynu tymczasowego dla przesyłanych danych między klastrem usługi Azure Databricks i usługą Azure Synapse.

Poniższa ilustracja przedstawia przepływ aplikacji:

Azure Databricks with Data Lake Store and Azure Synapse

Ten samouczek obejmuje następujące zadania:

  • Tworzenie usługi Azure Databricks.
  • Tworzenie klastra Spark w usłudze Azure Databricks.
  • Tworzenie systemu plików na koncie usługi Data Lake Storage Gen2.
  • Przekazywanie danych przykładowych na konto usługi Azure Data Lake Storage Gen2.
  • Tworzenie jednostki usługi.
  • Wyodrębnianie danych z konta usługi Azure Data Lake Storage Gen2.
  • Przekształcanie danych w usłudze Azure Databricks.
  • Ładowanie danych do usługi Azure Synapse.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Uwaga

Nie można przeprowadzić tego samouczka przy użyciu bezpłatnej subskrypcji próbnej platformy Azure. Jeśli masz bezpłatne konto, przejdź do swojego profilu i zmień subskrypcję na płatność zgodnie z rzeczywistym użyciem. Aby uzyskać więcej informacji, zobacz Bezpłatne konto platformy Azure. Następnie usuń limit wydatków i zażądaj zwiększenia limitu przydziału dla procesorów wirtualnych w Twoim regionie. Podczas tworzenia obszaru roboczego usługi Azure Databricks możesz wybrać warstwę cenową Wersja próbna (Premium — 14-dniowa bezpłatna jednostka DBU), aby zapewnić obszarowi roboczemu dostęp do bezpłatnych jednostek DBU usługi Azure Databricks w warstwie Premium przez 14 dni.

Wymagania wstępne

Przed rozpoczęciem tego samouczka wykonaj następujące zadania:

Zbieranie potrzebnych informacji

Upewnij się, że zostały spełnione wszystkie wymagania wstępne tego samouczka.

Przed rozpoczęciem należy zebrać następujące informacje:

✔️ Nazwa bazy danych, nazwa serwera bazy danych, nazwa użytkownika i hasło usługi Azure Synapse.

✔️ Klucz dostępu konta magazynu obiektów blob.

✔️ Nazwa konta magazynu usługi Data Lake Storage Gen2.

✔️ Identyfikator dzierżawy subskrypcji.

✔️ Identyfikator aplikacji zarejestrowanej w usłudze Microsoft Entra ID (dawniej Azure Active Directory).

✔️ Klucz uwierzytelniania aplikacji zarejestrowanej w usłudze Microsoft Entra ID (dawniej Azure Active Directory).

Tworzenie usługi Azure Databricks

W tej sekcji utworzysz usługę Azure Databricks przy użyciu witryny Azure Portal.

  1. W menu portalu Azure wybierz polecenie Utwórz zasób.

    Create a resource on Azure portal

    Następnie wybierz pozycję Analiza>usługi Azure Databricks.

    Create Azure Databricks on Azure portal

  2. W obszarze Usługa Azure Databricks podaj następujące wartości, aby utworzyć usługę Databricks:

    Właściwości opis
    Nazwa obszaru roboczego Podaj nazwę obszaru roboczego usługi Databricks.
    Subskrypcja Z listy rozwijanej wybierz subskrypcję platformy Azure.
    Grupa zasobów: Określ, czy chcesz utworzyć nową grupę zasobów, czy użyć istniejącej grupy. Grupa zasobów to kontener, który przechowuje powiązane zasoby dla rozwiązania platformy Azure. Aby uzyskać więcej informacji, zobacz Omówienie usługi Azure Resource Manager.
    Lokalizacja Wybierz pozycję Zachodnie stany USA 2. Inne dostępne regiony podano na stronie dostępności usług platformy Azure według regionów.
    Warstwa cenowa Wybierz opcję Standardowa.
  3. Tworzenie konta potrwa kilka minut. Stan operacji można monitorować za pomocą paska postępu znajdującego się u góry.

  4. Wybierz pozycję Przypnij do pulpitu nawigacyjnego, a następnie pozycję Utwórz.

Tworzenie klastra Spark w usłudze Azure Databricks

  1. W witrynie Azure Portal przejdź do utworzonej usługi Databricks i wybierz pozycję Uruchom obszar roboczy.

  2. Nastąpi przekierowanie do portalu usługi Azure Databricks. W portalu wybierz pozycję Klaster.

    Databricks on Azure

  3. Na stronie Nowy klaster podaj wartości, aby utworzyć klaster.

    Create Databricks Spark cluster on Azure

  4. Uzupełnij wartości następujących pól i zaakceptuj wartości domyślne w pozostałych polach:

    • Wprowadź nazwę klastra.

    • Upewnij się, że zaznaczono pole wyboru Zakończ po __ minutach braku aktywności . Podaj czas (w minutach), po jakim działanie klastra ma zostać zakończone, jeśli nie jest on używany.

    • Wybierz pozycję Utwórz klaster. Po uruchomieniu klastra możesz dołączać do niego notesy i uruchamiać zadania Spark.

Tworzenie systemu plików na koncie usługi Azure Data Lake Storage Gen2

W tej sekcji utworzysz notes w obszarze roboczym usługi Azure Databricks, a następnie uruchomisz fragmenty kodu, aby skonfigurować konto magazynu.

  1. W witrynie Azure Portal przejdź do utworzonej usługi Azure Databricks i wybierz pozycję Uruchom obszar roboczy.

  2. Po lewej stronie wybierz pozycję Obszar roboczy. Z listy rozwijanej Obszar roboczy wybierz pozycję Utwórz>Notes.

    Create a notebook in Databricks

  3. W oknie dialogowymTworzenie notesu wprowadź nazwę notesu. Jako język wybierz pozycję Scala, a następnie wybierz utworzony wcześniej klaster Spark.

    Provide details for a notebook in Databricks

  4. Wybierz pozycję Utwórz.

  5. Poniższy blok kodu ustawia domyślne poświadczenia jednostki usługi dla dowolnego konta usługi ADLS Gen 2 dostępnego w sesji platformy Spark. Drugi blok kodu dołącza nazwę konta do ustawienia w celu określenia poświadczeń dla określonego konta usługi ADLS Gen 2. Skopiuj i wklej dowolny blok kodu w pierwszej komórce notesu usługi Azure Databricks.

    Konfiguracja sesji

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

    Konfiguracja konta

    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. W tym bloku kodu zamień symbole zastępcze <app-id>, <secret>, <tenant-id> i <storage-account-name> na wartości zebrane podczas wykonywania kroków wymagań wstępnych. Zastąp symbol zastępczy <file-system-name> dowolną nazwą, którą chcesz nadać systemowi plików.

    • Parametry <app-id> i <secret> pochodzą z aplikacji zarejestrowanej w usłudze Active Directory podczas tworzenia jednostki usługi.

    • Parametr <tenant-id> pochodzi z subskrypcji.

    • Parametr <storage-account-name> to nazwa konta magazynu usługi Azure Data Lake Storage Gen2.

  7. Naciśnij klawisze SHIFT+ENTER, aby uruchomić kod w tym bloku.

Pozyskiwanie danych przykładowych na konto usługi Azure Data Lake Storage Gen2

Przed przystąpieniem do pracy z tą sekcją musisz zapewnić spełnienie następujących wymagań wstępnych:

Wprowadź następujący kod w komórce notesu:

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

W tej komórce naciśnij klawisze SHIFT + ENTER, aby uruchomić kod.

Teraz w nowej komórce pod tą komórką wprowadź następujący kod, zastępując wartości w nawiasach tymi samymi wartościami, których użyto wcześniej:

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

W tej komórce naciśnij klawisze SHIFT + ENTER, aby uruchomić kod.

Wyodrębnianie danych z konta usługi Azure Data Lake Storage Gen2

  1. Teraz możesz załadować przykładowy plik json jako ramkę danych w usłudze Azure Databricks. Wklej następujący kod w nowej komórce. Zastąp symbole zastępcze umieszczone w nawiasach ostrokątnych własnymi wartościami.

    val df = spark.read.json("abfss://" + fileSystemName + "@" + storageAccountName + ".dfs.core.windows.net/small_radio_json.json")
    
  2. Naciśnij klawisze SHIFT+ENTER, aby uruchomić kod w tym bloku.

  3. Uruchom poniższy kod, aby wyświetlić zawartość ramki danych:

    df.show()
    

    Zostaną wyświetlone dane wyjściowe podobne do następującego fragmentu kodu:

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

    Masz teraz dane wyodrębnione z usługi Azure Data Lake Storage 2. generacji do usługi Azure Databricks.

Przekształcanie danych w usłudze Azure Databricks

Plik przykładowych danych pierwotnych, small_radio_json.json, przechwytuje odbiorców stacji radiowej i ma wiele kolumn. W tej sekcji przekształcisz dane tak, aby z zestawu danych były pobierane tylko określone kolumny.

  1. Zacznij od pobrania tylko kolumn firstName, lastName, gender, location i level z utworzonej ramki danych.

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

    Otrzymasz dane wyjściowe pokazane w poniższym fragmencie kodu:

    +---------+----------+------+--------------------+-----+
    |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. Możesz dalej przekształcać te dane, aby zmienić nazwę kolumny level na subscription_type.

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

    Otrzymasz dane wyjściowe pokazane w poniższym fragmencie kodu.

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

Ładowanie danych do usługi Azure Synapse

W tej sekcji przekażesz przekształcone dane do usługi Azure Synapse. Łącznik usługi Azure Synapse dla usługi Azure Databricks służy do bezpośredniego przekazywania ramki danych jako tabeli w puli usługi Synapse Spark.

Jak wspomniano wcześniej, łącznik usługi Azure Synapse używa usługi Azure Blob Storage jako magazynu tymczasowego do przekazywania danych między usługą Azure Databricks i usługą Azure Synapse. Możesz rozpocząć od podania konfiguracji umożliwiającej nawiązanie połączenia z kontem magazynu. Musisz już mieć utworzone konto w ramach wymagań wstępnych dotyczących tego artykułu.

  1. Podaj konfigurację umożliwiającą uzyskanie dostępu do konta usługi Azure Storage z usługi Azure Databricks.

    val blobStorage = "<blob-storage-account-name>.blob.core.windows.net"
    val blobContainer = "<blob-container-name>"
    val blobAccessKey =  "<access-key>"
    
  2. Określ folder tymczasowy do użycia podczas przenoszenia danych między usługą Azure Databricks i usługą Azure Synapse.

    val tempDir = "wasbs://" + blobContainer + "@" + blobStorage +"/tempDirs"
    
  3. Uruchom poniższy fragment kodu, aby zapisać klucze dostępu usługi Azure Blob Storage w konfiguracji. Dzięki tej akcji nie będzie trzeba przechowywać klucza dostępu w notesie w postaci zwykłego tekstu.

    val acntInfo = "fs.azure.account.key."+ blobStorage
    sc.hadoopConfiguration.set(acntInfo, blobAccessKey)
    
  4. Podaj wartości, aby nawiązać połączenie z wystąpieniem usługi Azure Synapse. Musisz utworzyć usługę Azure Synapse Analytics jako wymaganie wstępne. Użyj w pełni kwalifikowanej nazwy serwera dla serwera dwServer. Na przykład <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. Uruchom poniższy fragment kodu, aby załadować przekształconą ramkę danych o nazwieColumnsDF jako tabelę w usłudze Azure Synapse. Ten fragment kodu tworzy tabelę o nazwie SampleTable w bazie danych 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()
    

    Uwaga

    W tym przykładzie użyto flagi forward_spark_azure_storage_credentials , która powoduje, że usługa Azure Synapse uzyskuje dostęp do danych z magazynu obiektów blob przy użyciu klucza dostępu. Jest to jedyna obsługiwana metoda uwierzytelniania.

    Jeśli usługa Azure Blob Storage jest ograniczona do wybierania sieci wirtualnych, usługa Azure Synapse wymaga tożsamości usługi zarządzanej zamiast kluczy dostępu. Spowoduje to błąd "To żądanie nie ma autoryzacji do wykonania tej operacji".

  6. Połącz się z usługą SQL Database i sprawdź, czy jest widoczna baza danych o nazwie SampleTable.

    Verify the sample table

  7. Uruchom wybrane zapytanie, aby sprawdzić zawartość tabeli. Tabela powinna zawierać takie same dane jak ramka danych renamedColumnsDF.

    Verify the sample table content

Czyszczenie zasobów

Po ukończeniu tego samouczka możesz przerwać działanie klastra. W obszarze roboczym usługi Azure Databricks wybierz pozycję Klastry po lewej stronie. Aby przerwać działanie klastra, w obszarze Akcje wskaż wielokropek (...) i wybierz ikonę Przerwij.

Stop a Databricks cluster

Jeśli klaster nie zostanie przerwany ręcznie, zostanie automatycznie zatrzymany, pod warunkiem, że pole wyboru Zakończ po __ minutach braku aktywności zostało zaznaczone podczas tworzenia klastra. W takim przypadku nieaktywny klaster automatycznie zatrzymuje się po określonym czasie.

Następne kroki

W tym samouczku zawarto informacje na temat wykonywania następujących czynności:

  • Tworzenie usługi Azure Databricks
  • Tworzenie klastra Spark w usłudze Azure Databricks
  • Tworzenie notesu w usłudze Azure Databricks
  • Wyodrębnianie danych z konta usługi Data Lake Storage Gen2
  • Przekształcanie danych w usłudze Azure Databricks
  • Ładowanie danych do usługi Azure Synapse