Tutorial: Extrair, transformar e carregar dados usando o Azure Databricks

Neste tutorial, você executa uma operação ETL (extrair, transformar e carregar dados) usando o Azure Databricks. Você extrai dados do Azure Data Lake Storage Gen2 para o Azure Databricks, executa transformações nos dados no Azure Databricks e carrega os dados transformados no Azure Synapse Analytics.

As etapas neste tutorial usam o conector Azure Synapse para Azure Databricks para transferir dados para o Azure Databricks. Esse conector, por sua vez, usa o Armazenamento de Blobs do Azure como armazenamento temporário para os dados que estão sendo transferidos entre um cluster do Azure Databricks e o Azure Synapse.

A ilustração seguinte mostra o fluxo da aplicação:

Azure Databricks with Data Lake Store and Azure Synapse

Este tutorial abrange as seguintes tarefas:

  • Crie um serviço Azure Databricks.
  • Crie um cluster do Spark no Azure Databricks.
  • Crie um sistema de arquivos na conta do Data Lake Storage Gen2.
  • Carregue dados de exemplo para a conta do Azure Data Lake Storage Gen2.
  • Crie uma entidade de serviço.
  • Extraia dados da conta do Azure Data Lake Storage Gen2.
  • Transforme dados no Azure Databricks.
  • Carregue dados no Azure Synapse.

Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Nota

Este tutorial não pode ser realizado usando a Assinatura de Avaliação Gratuita do Azure. Se tiver uma conta gratuita, aceda ao seu perfil e altere a sua subscrição para pagamento consoante a utilização. Para obter mais informações, veja Conta gratuita do Azure. Em seguida, remova o limite de gastos e solicite um aumento de quota para vCPUs na sua região. Ao criar seu espaço de trabalho do Azure Databricks, você pode selecionar a camada de preço de Avaliação (Premium - DBUs gratuitas de 14 dias) para dar ao espaço de trabalho acesso a DBUs Premium Databricks Premium gratuitas por 14 dias.

Pré-requisitos

Conclua estas tarefas antes de começar este tutorial:

Reúna as informações de que precisa

Certifique-se de concluir os pré-requisitos deste tutorial.

Antes de começar, você deve ter estes itens de informação:

✔️ O nome do banco de dados, o nome do servidor de banco de dados, o nome de usuário e a senha do seu Azure Synapse.

✔️ A chave de acesso da sua conta de armazenamento de blob.

✔️ O nome da sua conta de armazenamento Data Lake Storage Gen2.

✔️ O ID do inquilino da sua subscrição.

✔️ A ID do aplicativo que você registrou com a ID do Microsoft Entra (anteriormente Azure Ative Directory).

✔️ A chave de autenticação para o aplicativo que você registrou com o Microsoft Entra ID (anteriormente Azure Ative Directory).

Criar um serviço Azure Databricks

Nesta seção, você cria um serviço Azure Databricks usando o portal do Azure.

  1. No menu do portal do Azure, selecione Criar um recurso.

    Create a resource on Azure portal

    Em seguida, selecione Analytics>Azure Databricks.

    Create Azure Databricks on Azure portal

  2. Em Serviço Azure Databricks, forneça os seguintes valores para criar um serviço Databricks:

    Property Description
    Nome da área de trabalho Indique um nome para a sua área de trabalho do Databricks.
    Subscrição Na lista pendente, selecione a sua subscrição do Azure.
    Grupo de recursos Especifique se quer criar um novo grupo de recursos ou utilizar um existente. Um grupo de recursos é um contentor que mantém recursos relacionados para uma solução do Azure. Para obter mais informações, veja Descrição geral do Grupo de Recursos do Azure.
    Localização Selecione E.U.A. Oeste 2. Para outras regiões disponíveis, veja Serviços do Azure disponíveis por região.
    Escalão de Preço selecione Standard.
  3. A criação da conta demora alguns minutos. Para monitorar o status da operação, visualize a barra de progresso na parte superior.

  4. Selecione Afixar ao dashboard e, em seguida, selecione Criar.

Criar um cluster do Spark no Azure Databricks

  1. No portal do Azure, vá para o serviço Databricks que você criou e selecione Iniciar Espaço de Trabalho.

  2. Você será redirecionado para o portal do Azure Databricks. No portal, selecione Cluster.

    Databricks on Azure

  3. Na página Novo cluster, indique os valores para criar um cluster.

    Create Databricks Spark cluster on Azure

  4. Preencha os valores para os campos seguintes e aceite os valores predefinidos para os outros campos:

    • Introduza um nome para o cluster.

    • Certifique-se de marcar a caixa de seleção Encerrar após __ minutos de inatividade . Se o cluster não estiver sendo usado, forneça uma duração (em minutos) para encerrar o cluster.

    • Selecione Criar cluster. Depois que o cluster estiver em execução, você poderá anexar blocos de anotações ao cluster e executar trabalhos do Spark.

Criar um sistema de arquivos na conta do Azure Data Lake Storage Gen2

Nesta seção, você cria um bloco de anotações no espaço de trabalho do Azure Databricks e executa trechos de código para configurar a conta de armazenamento

  1. No portal do Azure, vá para o serviço Azure Databricks que você criou e selecione Iniciar Espaço de Trabalho.

  2. À esquerda, selecione Espaço de trabalho. No menu pendente Área de Trabalho, selecione Criar>Bloco de Notas.

    Create a notebook in Databricks

  3. Na caixa de diálogo Criar Bloco de Notas, introduza um nome para o bloco de notas. Selecione Scala como a linguagem e selecione o cluster do Spark que criou anteriormente.

    Provide details for a notebook in Databricks

  4. Selecione Criar.

  5. O bloco de código a seguir define as credenciais da entidade de serviço padrão para qualquer conta ADLS Gen 2 acessada na sessão do Spark. O segundo bloco de código acrescenta o nome da conta à configuração para especificar credenciais para uma conta ADLS Gen 2 específica. Copie e cole qualquer bloco de código na primeira célula do seu bloco de anotações do Azure Databricks.

    Configuração da sessão

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

    Account configuration (Configuração da conta)

    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. Neste bloco de código, substitua os valores , <secret>, <tenant-id>e <storage-account-name> de espaço reservado neste bloco de código pelos valores que você coletou ao concluir os <app-id>pré-requisitos deste tutorial. Substitua o valor do espaço reservado <file-system-name> pelo nome que você deseja dar ao sistema de arquivos.

    • O <app-id>, e <secret> são do aplicativo que você registrou com o Ative Directory como parte da criação de uma entidade de serviço.

    • O <tenant-id> é da sua assinatura.

    • O <storage-account-name> é o nome da sua conta de armazenamento do Azure Data Lake Storage Gen2.

  7. Pressione as teclas SHIFT + ENTER para executar o código neste bloco.

Ingerir dados de exemplo na conta do Azure Data Lake Storage Gen2

Antes de começar esta secção, tem de satisfazer os seguintes pré-requisitos:

Introduza o seguinte código numa célula do bloco de notas:

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

Na célula, pressione SHIFT + ENTER para executar o código.

Agora, em uma nova célula abaixo desta, insira o seguinte código e substitua os valores que aparecem entre colchetes pelos mesmos valores que você usou anteriormente:

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

Na célula, pressione SHIFT + ENTER para executar o código.

Extrair dados da conta do Azure Data Lake Storage Gen2

  1. Agora você pode carregar o arquivo json de exemplo como um quadro de dados no Azure Databricks. Cole o código a seguir em uma nova célula. Substitua os espaços reservados mostrados entre colchetes pelos seus valores.

    val df = spark.read.json("abfss://" + fileSystemName + "@" + storageAccountName + ".dfs.core.windows.net/small_radio_json.json")
    
  2. Pressione as teclas SHIFT + ENTER para executar o código neste bloco.

  3. Execute o seguinte código para ver o conteúdo do quadro de dados:

    df.show()
    

    Verá um resultado semelhante ao seguinte fragmento:

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

    Os dados foram agora extraídos do Armazenamento do Azure Data Lake Ger2 para o Azure Databricks.

Transformar dados no Azure Databricks

Os dados de amostra brutos small_radio_json.json arquivo capturam a audiência de uma estação de rádio e tem uma variedade de colunas. Nesta seção, você transforma os dados para recuperar apenas colunas específicas do conjunto de dados.

  1. Primeiro, recupere apenas as colunas firstName, lastName, gender, location e level do dataframe que você criou.

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

    Você recebe a saída conforme mostrado no seguinte trecho:

    +---------+----------+------+--------------------+-----+
    |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. Pode transformar mais os dados para mudar o nome da coluna level para subscription_type.

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

    Você recebe a saída conforme mostrado no trecho a seguir.

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

Carregar dados no Azure Synapse

Nesta seção, você carrega os dados transformados no Azure Synapse. Use o conector do Azure Synapse para Azure Databricks para carregar diretamente um dataframe como uma tabela em um pool do Synapse Spark.

Como mencionado anteriormente, o conector do Azure Synapse usa o armazenamento de Blob do Azure como armazenamento temporário para carregar dados entre o Azure Databricks e o Azure Synapse. Assim, comece por indicar a configuração para ligar à conta de armazenamento. Você já deve ter criado a conta como parte dos pré-requisitos para este artigo.

  1. Indique a configuração para aceder à conta de Armazenamento do Azure a partir do Azure Databricks.

    val blobStorage = "<blob-storage-account-name>.blob.core.windows.net"
    val blobContainer = "<blob-container-name>"
    val blobAccessKey =  "<access-key>"
    
  2. Especifique uma pasta temporária para usar ao mover dados entre o Azure Databricks e o Azure Synapse.

    val tempDir = "wasbs://" + blobContainer + "@" + blobStorage +"/tempDirs"
    
  3. Execute o seguinte fragmento para armazenar as chaves de acesso do armazenamento de Blobs do Azure na configuração. Esta ação garante que não tem de manter a chave de acesso no bloco de notas em texto simples.

    val acntInfo = "fs.azure.account.key."+ blobStorage
    sc.hadoopConfiguration.set(acntInfo, blobAccessKey)
    
  4. Forneça os valores para se conectar à instância do Azure Synapse. Você deve ter criado um serviço do Azure Synapse Analytics como pré-requisito. Use o nome do servidor totalmente qualificado para dwServer. Por exemplo, <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. Execute o seguinte trecho para carregar o dataframe transformado, renamedColumnsDF, como uma tabela no Azure Synapse. Este fragmento cria uma tabela chamada SampleTable na base de dados 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()
    

    Nota

    Este exemplo usa o sinalizador, que faz com que o forward_spark_azure_storage_credentials Azure Synapse acesse dados do armazenamento de blob usando uma chave de acesso. Este é o único método de autenticação suportado.

    Se o seu Armazenamento de Blobs do Azure estiver restrito a redes virtuais selecionadas, o Azure Synapse exigirá Identidade de Serviço Gerenciado em vez de Chaves de Acesso. Isso causará o erro "Esta solicitação não está autorizada a executar esta operação".

  6. Conecte-se ao banco de dados SQL e verifique se você vê um banco de dados chamado SampleTable.

    Verify the sample table

  7. Execute uma consulta select para verificar os conteúdos da tabela. A tabela deve ter os mesmos dados que o dataframe renamedColumnsDF .

    Verify the sample table content

Clean up resources (Limpar recursos)

Depois de concluir o tutorial, você pode encerrar o cluster. No espaço de trabalho do Azure Databricks, selecione Clusters à esquerda. Para que o cluster termine, em Ações, aponte para as reticências (...) e selecione o ícone Encerrar .

Stop a Databricks cluster

Se você não encerrar manualmente o cluster, ele será interrompido automaticamente, desde que você marque a caixa de seleção Encerrar após __ minutos de inatividade quando você criou o cluster. Nesse caso, o cluster para automaticamente se estiver inativo durante o tempo especificado.

Próximos passos

Neste tutorial, ficou a saber como:

  • Criar um serviço Azure Databricks
  • Criar um cluster do Spark no Azure Databricks
  • Criar um bloco de notas no Azure Databricks
  • Extrair dados de uma conta do Data Lake Storage Gen2
  • Transformar dados no Azure Databricks
  • Carregar dados no Azure Synapse