Escolar Documentos
Profissional Documentos
Cultura Documentos
ETL Com o Livro de Receitas Do Azure
ETL Com o Livro de Receitas Do Azure
Com este livro de receitas, você se tornará bem versado em todos os recursos
do SQL Server Integration Services (SSIS) para executar tarefas de migração de
dados e ETL que se integram ao Azure. Você aprenderá como transformar dados
no Azure e entenderá como os sistemas herdados executam ETL no local usando
o SSIS. Os capítulos posteriores o atualizarão com a conexão e a recuperação de
dados de Clusters de Big Data do SQL Server 2019 e até mostrarão como
estender e personalizar a caixa de ferramentas do SSIS usando tarefas e
transformações desenvolvidas de forma personalizada. Este livro de ETL também
contém receitas práticas para mover e transformar dados com serviços do Azure,
como o Data Factory e o Azure Databricks, e permite explorar várias opções para
migrar pacotes SSIS para o Azure. No final, você descobrirá como criar perfis de
dados na nuvem e automatizar o desenvolvimento de pacotes com a Business
Intelligence Markup Language (BIML).
Ao final deste livro, você terá desenvolvido as habilidades necessárias para criar e
automatizar soluções de ETL no local, bem como no Azure.
O Capítulo 3, Criando e usando clusters de Big Data do SQL Server 2019, discute
como criar, implantar, conectar-se e recuperar dados de clusters de Big Data do
SQL Server 2019.
O Capítulo 6, Azure Data Factory, fala sobre como usar o Azure Data Factory para
mover e transformar dados na nuvem.
Se você estiver usando a versão digital deste livro, recomendamos que você
mesmo digite o código ou acesse o código através do repositório GitHub
(link disponível na próxima seção). Isso ajudará você a evitar possíveis erros
relacionados à cópia e colagem de código.
Também temos outros pacotes de código do nosso rico catálogo de livros e vídeos
disponíveis no https://github.com/PacktPublishing/. Confira!
Convenções utilizadas
Há uma série de convenções de texto usadas ao longo deste livro.
Code in text: Indica palavras de código em texto, nomes de tabelas de banco de
dados, nomes de pastas, nomes de arquivos, extensões de arquivo, nomes de
caminhos, URLs fictícios, entrada de usuário e identificadores do Twitter. Aqui está
um exemplo: "Para o local, use como o caminho da pasta e como o nome do
arquivo."hivesourcesales.dat
FROM etlinazure.salesource
USE master;
GO
GO
CopyExplain
Negrito: indica um novo termo, uma palavra importante ou palavras que você vê
na tela. Por exemplo, palavras em menus ou caixas de diálogo aparecem no texto
como esta. Aqui está um exemplo: "Clique na lista ao lado da propriedade
Enumerator e selecione Foreach Azure Blob Enumerator."
Apareça assim.
Seções
Neste livro, você encontrará vários títulos que aparecem com frequência
(Preparando-se, Como fazer..., Como funciona..., Há mais..., e Veja também).
Para dar instruções claras sobre como completar uma receita, use estas seções
da seguinte maneira:
Preparando-se
Esta seção informa o que esperar na receita e descreve como configurar qualquer
software ou quaisquer configurações preliminares necessárias para a receita.
Como fazer...
Esta seção contém as etapas necessárias para seguir a receita.
Como funciona...
Esta seção geralmente consiste em uma explicação detalhada do que aconteceu
na seção anterior.
Tem mais...
Esta seção consiste em informações adicionais sobre a receita, a fim de torná-lo
mais conhecedor sobre a receita.
See also
This section provides helpful links to other useful information for the recipe.
Entre em contato
Feedback de nossos leitores é sempre bem-vindo.
Feedback geral: Se você tiver dúvidas sobre qualquer aspecto deste livro,
mencione o título do livro no assunto de sua mensagem e envie-nos um e-mail
para customercare@packtpub.com.
Opiniões
Por favor, deixe um comentário. Depois de ter lido e usado este livro, por que não
deixar um comentário no site que você comprou? Os leitores em potencial podem
então ver e usar sua opinião imparcial para tomar decisões de compra, nós da
Packt podemos entender o que você pensa sobre nossos produtos e nossos
autores podem ver seu feedback sobre seu livro. Obrigado!
Este capítulo aborda as seguintes receitas que ajudarão você a começar a usar o
desenvolvimento do SSIS no local e na nuvem:
Requisitos técnicos
Para instalar os componentes necessários, você precisará de uma estação de
trabalho – seja um computador pessoal físico ou virtual – executando um
sistema operacional Microsoft Windows compatível. O SQL Server 2019 pode ser
instalado em qualquer edição do sistema operacional Microsoft Windows Server,
começando com o Windows Server 2016, ou até mesmo em sua edição desktop,
Windows 10, começando com a versão TH1, build 1507.
Dependendo dos recursos instalados, o SQL Server exigirá entre 6 e
aproximadamente 8 GB de espaço livre no disco rígido e pelo menos 1 GB de
memória do sistema disponível, embora cerca de 4 GB seja o mínimo
recomendado. Praticamente qualquer CPU de 64 bits é suportada.
Observação importante
Observação importante
Preparando-se
Você precisa acessar a mídia de instalação do SQL Server 2019. Como esta será
uma instalação típica de estação de trabalho de desenvolvimento, você pode usar
o SQL Server 2019 Developer Edition gratuito e especializado, disponível para
download em https://www.microsoft.com/en-us/sql-server/sql-server-downloads.
Como alternativa, você também pode usar uma edição de avaliação gratuita
do SQL Server 2019 Standard ou as edições do Data Center, mas observe que
seu uso é limitado a 180 dias.
Observação importante
Como fazer...
Inicie sua estação de trabalho e faça login com uma conta com privilégios
administrativos do sistema operacional. Verifique se a estação de trabalho tem
acesso à mídia de instalação do SQL Server 2019 – por exemplo, verifique se o
arquivo executável da edição do desenvolvedor está disponível na unidade local:
Ponta
Geralmente, você só baixará a mídia de instalação se planeja instalar o SQL
Server em dispositivos adicionais. Por outro lado, uma boa razão para ter a
mídia disponível localmente seria no caso de você precisar reparar a
instalação mais tarde.
Selecione Personalizar para continuar.
Observação importante
Não instale a edição Express do SQL Server 2019, pois ela não inclui o SSIS,
nem vem com muitos dos outros recursos que você precisará para as receitas
deste livro de receitas.
Ponta
Se o SQL Server não tiver sido instalado nesta estação de trabalho antes ou
ainda não tiver sido configurado para acesso externo, você poderá ver o aviso
do Firewall do Windows, conforme mostrado na captura de tela. Nesse caso
específico, o aviso aponta para informações sobre como configurar o firewall
do Windows para permitir acesso externo à instância do SQL Server.
Este guia pressupõe que você usará uma estação de trabalho onde o SQL
Server não foi instalado antes, mas você também pode usar uma instância
existente do SQL Server, se preferir.
10. Na página Seleção de Recursos, selecione os seguintes recursos a serem
instalados:
e) Serviços de Integração
11. If you are installing this SQL Server instance on a workstation where SQL
Server has not been installed before, you can create either a
new default instance or a named instance. Otherwise, your options will
depend on what parts of SQL Server are already installed on the system:
13. On the Java Install Location page, leave the default option selected to install
the version of the Java runtime environment included in the installation, as
shown in the following screenshot, unless you are installing to an environment
where a different version is required by your administrators:
Figure 1.10 – Java Install Location
If you have to install a different version, select the second option, and
use Browse to locate the installation files.
15. On the Collation tab of the same page, you can leave the default collation for
the database engine; however, it is recommended to use a Windows collation
instead.
a) Collation designator: Latin1_General_100
b) Accent-sensitive: Checked
After a few moments, your username should appear in the SQL Server
administrators list box.
You do not have to make any changes to the rest of the settings on this page
unless you want to change the location of the database files, which you can do
on the Data Directories tab.
Important note
For the purposes of this cookbook, you can use the default locations on
the drive for the database files; however, in a real-life environment – even if
solely for testing purposes – it is recommended to host the database files on a
different drive, not the one used for the operating system and other installed
features files.C:
When you are sure that everything has been configured in accordance with
the instructions in this recipe, click Install to start the automated part of the
installation. On modern hardware, the installation should complete within a few
minutes.
18. Once the installation has completed, inspect the installation status of each
installed feature. If any errors are encountered during the installation, they will
be marked with a Failed installation status. When you select each feature
reported as failed, additional information about the failure should be displayed
in the Details section:
Figure 1.15 – The final step of the SQL Server 2019 installation
Inspect any error messages and address the cause of each problem based on
the information provided. You can repeat the installation after you have
resolved the problems.
One more task awaits you, and then the installation can be considered
finished (for the time being, at least). In order to allow the PolyBase services
access to the SQL Server instance, you must allow connections to the
instance through the TCP/IP protocol.
The reason for this is that the services are unable to connect to the SQL
Server instance. They use TCP/IP to connect, and on a newly installed SQL
Server instance, this protocol is not enabled.
A warning is displayed, telling you that in order for the changes to take effect,
the affected service must be restarted. Click OK to close the warning.
21. Back under SQL Server Services, right-click the SQL Server
(MSSQLSERVER) service, and select Restart from the shortcut menu:
22. Wait for the service to restart. When prompted to stop or restart any other
dependent service, confirm those as well. After the SQL Server instance has
restarted, the PolyBase services should start as well. However, if they stay in
the Change Pending… state for an extended period of time, try starting them
manually. If even that fails, you might have to restart the workstation.
How it works…
You have just successfully installed a new SQL Server instance. You will use it to
complete the rest of the recipes in this cookbook; of course, it can also be used for
other development work involving the SQL Server platform. If you later determine
that you need additional features, you can add them by starting the installation
again from SQL Server Installation Center.
Important note
Se você instalou a edição Developer do produto, lembre-se de que ela não
foi licenciada para uso em produção. Você só tem permissão para usá-lo para
desenvolvimento e teste de aplicativos.
Observação importante
Preparando-se
Há vários anos, o SSMS é fornecido como uma ferramenta autônoma, não mais
associada a uma versão específica do SQL Server. Essa decisão permite que a
Microsoft desenvolva a ferramenta em seu próprio ciclo de desenvolvimento,
praticamente completamente independente do ciclo de desenvolvimento que eles
usam para a plataforma SQL Server. Ele também concede à equipe de
desenvolvimento por trás da ferramenta mais flexibilidade em termos dos recursos
que estão sendo implantados ou atualizados em cada versão.
Portanto, o SSMS não está mais incluído como parte da instalação do SQL
Server, como costumava ser no passado, e deve ser instalado separadamente.
Está disponível para download
em https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-
studio-ssms.
Ponta
Na verdade, isso é verdade para todas as ferramentas que você instalará neste e
nos próximos capítulos.
Como fazer...
Use seu navegador de Internet favorito para navegar até o site de download do
SSMS listado anteriormente ou inicie a Central de Instalação do SQL Server – ela
está localizada no menu Iniciar, na pasta – e, na página Instalação, selecione a
opção Instalar Ferramentas de Gerenciamento do SQL Server.Microsoft SQL
Server 2019
14. Depois que o banco de dados tiver sido restaurado com êxito, clique
em OK para fechar a caixa de mensagem, que também fecha a caixa de
diálogo Restaurar Banco de Dados.
Agora que você tem sua primeira ferramenta instalada, você pode alterar
mais duas configurações que você pode precisar mais tarde.
EXEC sp_configure
@configvalue = 7;
reconfigure;
CopyExplain
Ponta
Se o valor da coluna for , isso significa que o PolyBase não está habilitado;
habilite-o alterando o valor de configuração para executando os seguintes
comandos T-SQL:run_value01
EXEC sp_configure
@configvalue = 1;
RECONFIGURE;
CopyExplain
Ponta
Observação importante
A instância do SQL Server deve ser reiniciada para que essas duas
definições de configuração entrem em vigor, pois afetam os serviços
dependentes do PolyBase. Além disso, você não pode reiniciar uma instância
do SQL Server executando o PolyBase de dentro do SSMS quando
o Pesquisador de Objetos está conectado ao serviço e impede que o
serviço seja interrompido.
Como funciona...
Você instalou a ferramenta principal de desenvolvimento e administração do SQL
Server. Você usará o SSMS ao longo deste livro de receitas. Claro, se você já
trabalhou com o SQL Server antes, você já deve estar familiarizado com o SSMS
e seus recursos. Se esta é a primeira vez que você usa o SSMS, não se preocupe
– todos os recursos usados nas receitas deste livro serão explicados quando
necessário.
Para usar a versão 2019 do SSDT, primeiro você precisa instalar o Visual Studio
2019 e, em seguida, adicionar as extensões SSDT, seguidas pelas extensões
necessárias para desenvolver projetos do Analysis Services, Integration Services
e/ou Reporting Services. Isso aumenta a complexidade do procedimento de
instalação, mas também segue mais de perto a abordagem padrão de adicionar
recursos à instalação principal do Visual Studio.
Preparando-se
Se você não tiver uma licença válida do Visual Studio 2019 Professional
ou Enterprise à sua disposição, também poderá usar a
edição comunitária gratuita do Visual Studio 2019. Todas as edições estão
disponíveis para download em https://docs.microsoft.com/en-us/sql/ssdt/download-
sql-server-data-tools-ssdt. Esse local também pode ser acessado na Central de
Instalação do SQL Server.
Como fazer...
Use seu navegador de Internet favorito para navegar até o site de download do
Visual Studio 2019 listado anteriormente ou inicie a Central de Instalação do SQL
Server e, na página Instalação, selecione a opção Instalar Ferramentas de
Dados do SQL Server.
Esta receita pressupõe que o Visual Studio 2019 ainda não foi instalado na
estação de trabalho e as instruções mostrarão como instalar o Visual Studio 2019
Community Edition:
1. Na página da Web Baixar o SSDT (Ferramentas de dados do SQL
Server) para Visual Studio, na seção Instalar SSDT com o Visual Studio
2019, localize o link para a Comunidade do Visual Studio 2019 e siga esse
link para a página Downloads do Visual Studio 2019. Clique
em DOWNLOAD GRATUITO na coluna Comunidade para iniciar a operação
de download e salvar o arquivo na unidade local em sua estação de trabalho.
2. Quando solicitado, clique em Executar para iniciar a instalação; caso
contrário, use o Windows Explorer para navegar até sua pasta e inicie a
instalação abrindo o arquivo.vs_Community.exe
3. A instalação começa com a configuração de alguns pré-requisitos. Você pode
aproveitar este momento para inspecionar a Declaração de Privacidade da
Microsoft e os Termos de Licença para Software Microsoft seguindo os
links fornecidos na caixa de mensagem:
11. Uma janela do navegador da Internet deve abrir, solicitando que você salve o
arquivo em sua unidade local. Salve o arquivo na unidade local da estação de
trabalho.
12. Se solicitado pelo navegador para executar o arquivo, clique
em Executar para iniciar a instalação; caso contrário, use o Windows
Explorer para navegar até sua pasta e abra o arquivo para iniciar a
instalação.downloadsMicrosoft.DataTools.IntegrationServices.exe
13. Na primeira caixa de diálogo, selecione o idioma a ser usado durante a
instalação. Você pode usar qualquer um dos idiomas suportados; no entanto,
observe que essas instruções pressupõem que você selecionou o idioma
inglês. Quando estiver pronto, clique em OK para continuar.
14. Na próxima caixa de diálogo, basta clicar em Avançar para continuar.
15. Na próxima caixa de diálogo, verifique se sua edição do Visual Studio 2019
está selecionada como o destino da instalação, mas não clique
em Instalar ainda.
16. Alterne para o Visual Studio 2019, feche a caixa de diálogo Gerenciar
extensões e feche o Visual Studio também.
Observação importante
Feche a janela do navegador da Internet que foi usada para baixar o instalador de
projetos do SQL Server Integration Services e o instalador do Visual Studio, se
eles ainda estiverem abertos.
Como funciona...
Você instalou o Visual Studio 2019 com os recursos necessários para concluir o
restante das receitas neste livro. Essas receitas cobrirão o desenvolvimento típico
do SSIS, mas também o fluxo de controle e a personalização do fluxo de dados.
Você pode usar a mesma instalação para concluir muitas outras tarefas de
desenvolvimento e, se necessário, pode instalar quaisquer recursos adicionais a
qualquer momento, executando o Visual Studio Installer – disponível no menu
Iniciar do Windows.
Observação importante
Alguns dias antes de o período de avaliação expirar, se você tentar abrir o SSDT,
será solicitado que você faça login, mas também poderá entrar a qualquer
momento.
Se você é novo no ADS ou precisa de ajuda para determinar como equilibrar seu
trabalho entre o ADS e o SSMS, recomendamos o artigo introdutório O que é o
Azure Data Studio?, disponível online
em https://docs.microsoft.com/en-us/sql/azure-data-studio/what-is.
Preparando-se
A instalação do ADS está disponível online,
no https://docs.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-
studio.
Como fazer...
Use seu navegador de internet favorito para navegar até o site de download do
ADS listado anteriormente:
Como funciona...
Agora você instalou o ADS, a mais nova adição ao conjunto de ferramentas de
desenvolvimento e administração da plataforma de dados da Microsoft. Algumas
das receitas deste livro de receitas exigirão o uso de recursos que estão
disponíveis no ADS, mas não no SSMS.
Criando uma assinatura do Azure
Um dos objetivos deste livro de receitas é mostrar como integrar suas soluções de
armazenamento de dados locais com recursos de armazenamento, manutenção e
consumo de dados baseados em nuvem da plataforma de dados da Microsoft. Um
dos pré-requisitos necessários para seguir esse objetivo é uma assinatura ativa do
Azure.
O Azure fornece uma variedade de serviços e recursos que você pode usar para
hospedar seus dados fora do local, estender suas próprias soluções de
gerenciamento de dados locais e baseadas em nuvem com serviços baseados em
nuvem fornecidos pela Microsoft e pelo Microsoft Partner Network e até mesmo
hospedar suas próprias soluções como serviços baseados em nuvem a serem
usados por seus clientes.
Se você já tiver acesso a uma assinatura válida do Azure, poderá usá-la para
todas as receitas relevantes deste livro; caso contrário, você pode usar esta
receita para criar uma nova.
Uma assinatura gratuita do Azure fornecerá acesso aos serviços por 12 meses –
gratuitamente. Vários serviços são fornecidos sem custos, independentemente do
período de assinatura.
A assinatura gratuita inclui um crédito de 200 USD para ser usado para serviços
pagos por um período de 30 dias a partir da ativação da assinatura. Esse período
deve ser suficiente para você executar todas as receitas orientadas para a nuvem
fornecidas neste livro de receitas.
Observação importante
Preparando-se
O Azure é um serviço online, localizado em https://portal.azure.com/. Geralmente,
você usaria um navegador de internet para acessá-lo; no entanto, nas versões
mais recentes do sistema operacional Windows, você também pode usar o
aplicativo de portal do Azure. As instruções neste livro de receitas usam um
navegador da Internet para acessar o portal do Azure.
Como fazer...
Use seu navegador de internet favorito e navegue até o site do portal do Azure:
Você pode até criar uma nova conta de e-mail. Se preferir utilizar uma nova
conta de e-mail, clique em Obter um novo endereço de e-mail e o
formulário permitir-lhe-á criar uma nova conta de e-mail. Quando estiver
pronto, clique em Avançar para continuar.outlook.comhotmail.com
3. Na tela seguinte, crie uma senha para a conta. É recomendável que você siga
as recomendações padrão sobre como criar uma senha segura.
4. Na tela seguinte, forneça as informações do seu país/região e a data de seu
nascimento. Quando estiver pronto, clique em Avançar para continuar.
Em uma nova conta gratuita do Azure, nenhum dos serviços pagos pode ser
acessado até que a avaliação seja ativada. Você não precisa ativá-lo neste
momento; isso pode ser feito quando você analisa as receitas nos capítulos a
seguir em que os serviços pagos do Azure são necessários.
Observação importante
Para concluir a ativação, sua identidade será verificada por telefone usando o
método selecionado – por meio de uma mensagem de texto ou por meio de
uma chamada da central de atendimento.
Observação importante
Como funciona...
Você acabou de criar uma assinatura gratuita do Azure; Ele não só permitirá que
você complete a maioria das receitas neste livro de receitas, mas também
permitirá que você explore serviços adicionais que você pode usar para suas
necessidades pessoais ou profissionais.
Observação importante
Tem mais...
Se você decidir usar o Azure para mais do que apenas aprender sobre o
desenvolvimento do SSIS, eventualmente terá que atualizar sua conta. Se você
criar aplicativos ou fornecer serviços que também podem ser hospedados no
Azure, talvez considere até mesmo ingressar no Microsoft Partner Network.
Como fazer...
Em um navegador, vá para o portal do Microsoft Azure usando a seguinte
URL: https://portal.azure.com/#home.
5. Depois que o grupo de recursos for criado, clique em Ir para o grupo de
recursos na mensagem do log de atividades exibida. Ou você pode clicar
em Home no menu à esquerda e clicar em seu grupo de recursos na lista de
recursos recentes. Uma vez no grupo de recursos, clique em Criar
recursos, conforme mostrado na captura de tela a seguir:
Figura 2.5 – Adicionar um recurso a um grupo de recursos
a) Nome do servidor: Você deve usar algo como todos em letras minúsculas.
Aqui está a referência da Microsoft para nomenclatura do SQL
Server: https://docs.microsoft.com/en-us/azure/azure-resource-manager/
management/resource-name-rules#microsoftsql.<yourname>etlinazurecookbook
e) Local: selecione um local do Azure. Você deve usar a mesma região que o
grupo de recursos criado antes.
o Selecione Básico.
o Na folha Criar Banco de Dados SQL, clique em Rede. A
folha Rede aparece como mostrado na captura de tela a seguir:
Figura 2.10 – Folha Rede do servidor
Como funciona...
Criamos um servidor SQL no Azure e armazenamos um banco de dados de
exemplo nele: AdventureWorksLT. Tudo foi feito usando um navegador web,
sem necessidade de instalar nada em um PC. As próximas receitas mostrarão
como usar esse banco de dados com software local.
Preparando-se
Esta receita pressupõe que você tenha instalado o SSMS.
Como fazer...
Esta é uma receita muito curta e simples! Vamos começar abrindo o SSMS:
Como funciona...
Conectar-se a um banco de dados do SQL Azure não é tão simples quanto um
banco de dados local regular. Precisamos abrir regras de firewall para acessar o
banco de dados localmente. Isso é feito por design para impedir que dados mal-
intencionados acessem nossos dados no Azure. Mas, uma vez conectados,
podemos consultar os dados tão simplesmente como se fosse um banco de dados
regular do SQL Server local.
Criando um pacote ETL simples
Esta receita mostrará como criar um pacote ETL simples que faz o seguinte:
Preparando-se
Esta receita pressupõe que você tenha instalado o SSMS, o Visual Studio 2019 e
o SSIS.
Como fazer...
Vamos começar abrindo o Visual Studio 2019:
13. ,[NameStyle]
14. ,[Title]
15. ,[FirstName]
16. ,[MiddleName]
17. ,[LastName]
18. ,[Suffix]
FROM [SalesLT].[Customer]
CopyExplain
REPLACENULL(Suffix,""))
CopyExplain
21. Em Outros Destinos na caixa de ferramentas SSIS, adicione um destino
OLE DB ao Fluxo de Dados e anexe-o à transformação de coluna
derivada DER_FullName criada na Etapa 13 desta receita. Renomeie-
o OLEDBDST_SalesLT_CustomerFullName para indicar que estamos
carregando dados na tabela SalesLT.CustomerFullName.
22. Clique duas vezes nele para abri-lo. Verifique se o gerenciador de conexões
OLEDB está definido como o que criamos antes e se o modo de acesso à
tabela está definido como Tabela ou exibição – carregamento rápido.
23. Clique no botão Novo... ao lado de Nome da tabela ou da exibição e defina
as propriedades conforme mostrado na captura de tela a seguir:
24. Certifique-se de usar o nome da tabela . Se isso não for feito, outras etapas
da receita serão interrompidas. O script DDL do SQL para criar a tabela é o
seguinte:[SalesLT].[CustomerFullName]
25. CREATE TABLE [SalesLT].[CustomerFullName] (
)
CopyExplain
34. Clique em OK para fechar a janela Criar Tabela e retornar à tela anterior.
Clique em Mapeamentos à esquerda do Editor de destino OLE DB. Sua
tela deve se parecer com a captura de tela a seguir. Clique em OK para
fechar o editor e retornar à Tarefa de Fluxo de Dados:
Figura 2.23 – Guia Mapeamento do Editor de Destino OLE DB de Destino de
Destino
35. Para alinhar corretamente o conteúdo do Fluxo de Dados, clique com o botão
direito do mouse na barra de tarefas e selecione Layout no submenu,
conforme mostrado na captura de tela a seguir:
36. Agora, selecione todos os itens na tarefa Fluxo de Dados (Ctrl + A) e clique
no ícone Criar a mesma largura na barra de ferramentas Layout.
37. Para o toque final, alinharemos automaticamente todas as transformações no
Fluxo de Dados. No menu Formatar, selecione Layout
e diagrama automáticos, conforme mostrado na captura de tela a seguir:
Figura 2.25 – Seleção do menu Auto Layout Diagrama
40. Agora, clique com o botão direito do mouse no caminho entre a coluna
derivada e o destino novamente para Desabilitar o Visualizador de Dados,
pois não precisamos mais dele. Pare a execução do Fluxo de Dados clicando
no botão Parar.
41. Como etapa final, faremos nosso pacote idempotente, ou seja, certificando-
nos de que, sempre que o executarmos, os dados de destino serão
os mesmos.
a) Nome: SQL_Truncate_SalesLT_CustomerFullName
c) SQLSourceType: Entrada direta
42. Como fizemos para os itens de fluxo de dados, selecione ambas as tarefas e,
na barra de ferramentas Layout, clique em Criar mesma largura. No
menu Formatar, selecione Formatar > Layout Automático > Diagrama. Seu
pacote deve se parecer com a seguinte captura de tela:
Como funciona...
Esta receita mostrou um padrão de design ETL simples. A maioria dos pacotes
ETL são mais complexos, mas geralmente seguem o mesmo
padrão: Origem > Transformação > Carregamento em um destino. A fase de
transformação é bastante simples: ela usa uma expressão para concatenar as
colunas relacionadas ao nome, tomando cuidado com o fato de que a coluna pode
ser . O comando externo cuida do espaço na frente e no final da coluna porque as
colunas Título e Sufixo podem ser . É o mesmo para a coluna interna que está
cuidando da coluna NULL MiddleName.NULLTRIMNULLTRIM
1. Extraia e carregue dados em nosso data lake. Aqui, não temos um data lake
real; estamos usando o AdventureWorksLT no Azure para imitar o conceito
de data lake.
2. Transforme os dados dentro do banco de dados usando um script SQL
simples. Vamos adicionar a coluna FullName à tabela SalesLT.Customer e
atualizá-la usando esse script.
Preparando-se
Esta receita pressupõe que você tenha instalado o SSMS, o Visual Studio 2019 e
o SSIS.
Como fazer...
Vamos nos aprofundar na receita:
c) Instrução SQL:
UPDATE c
FROM SalesLT.Customer AS c
ON c.CustomerID = cfn.CustomerID;
CopyExplain
7. Execute o pacote.
8. Volte para o SSMS, crie uma nova consulta e digite a seguinte instrução SQL:
9. SELECT [CustomerID]
10. ,[FullName]
11. ,[NameStyle]
12. ,[Title]
13. ,[FirstName]
14. ,[MiddleName]
15. ,[LastName]
16. ,[Suffix]
17. ,[CompanyName]
18. ,[SalesPerson]
19. ,[EmailAddress]
20. ,[Phone]
FROM [SalesLT].[Customer]
CopyExplain
Como funciona...
Esta receita mostrou-lhe o padrão de ELT. Os dados foram extraídos da fonte
primeiro, depois carregados no banco de dados (como vimos na receita
anterior, Criando um pacote ETL simples). Em seguida, transformamos os
dados SalesLT.Customer usando dados já carregados.
Requisitos técnicos
As receitas neste capítulo pressupõem que você já tenha um ambiente de
desenvolvimento apropriado em vigor em sua estação de trabalho, incluindo uma
instância do SQL Server 2019, com as ferramentas de administração e
desenvolvimento instaladas e acesso a uma assinatura válida do Azure. Todos
esses pré-requisitos são abordados no Capítulo 1 deste livro de receitas,
intitulado Introdução ao Azure e ao SSIS 2019.
Observação importante
Observação importante
Antes de usar VMs do Azure ou configurar uma instância AKS, você também deve
estar familiarizado com o custo de hospedar esses recursos no Azure. Você pode
encontrar mais informações
em https://azure.microsoft.com/en-gb/pricing/details/virtual-machines/linux/.
Preparando-se
A configuração e a implantação de um cluster de Big Data hospedado no AKS são
totalmente integradas ao Azure Data Studio (ADS); portanto, você concluirá a
maioria das atividades a seguir no ADS.
Observação importante
1. Para atualizar sua assinatura gratuita do Azure, faça logon no portal do Azure
em https://portal.azure.com/.
2. Na página inicial, selecione Assinaturas.
3. Na página Subscrições, selecione a subscrição de Avaliação Gratuita que
já deve ter criado no Capítulo 1, Introdução ao Azure e ao SSIS 2019.
4. Na página de visão geral da assinatura, clique em Atualizar para iniciar o
procedimento de atualização.
Deve levar alguns instantes para verificar o estado da sua assinatura atual.
Observação importante
O plano sem suporte deve ser bom o suficiente para fins típicos de
desenvolvimento e teste e certamente é bom o suficiente para as receitas
deste livro. No entanto, para a utilização na produção, e especialmente para
as actividades de desenvolvimento a nível empresarial, um dos outros planos
seria provavelmente muito mais adequado.
Essas instruções pressupõem que você está interessado nas cotas atuais
nesta região específica, pois elas também serão usadas posteriormente na
receita. Para verificar as cotas em uma região diferente, substitua o valor do
argumento antes de executar o comando.Location
Observação importante
Se o valor da coluna for menor que 40, você terá que solicitar um aumento de cota
enviando uma solicitação de caso de suporte aos administradores. Informações
relevantes sobre isso estão disponíveis na documentação on-line do fornecedor,
em https://docs.microsoft.com/en-us/azure/azure-portal/supportability/per-vm-
quota-requests.Limit
Se você ainda não tiver feito isso, clone o repositório do livro de receitas para
o local padrão em sua estação de trabalho.
Agora você tem todos os pré-requisitos para começar com a primeira receita.
Como fazer...
Você usará o ADS para ativar um novo serviço em sua assinatura de avaliação do
Azure, ou seja, um cluster AKS. Em seguida, você configurará o cluster AKS
recém-criado para hospedar um cluster de Big Data do SQL Server 2019.
1. Inicie o ADS, a menos que já esteja aberto, e na página Bem-vindo, clique
em Implantar um servidor para iniciar o procedimento de implantação. Se a
página de boas-vindas estiver fechada, você poderá abri-la usando o
comando localizado no menu Ajuda.Welcome
2. Na janela Selecionar as opções de implantação, selecione Cluster de Big
Data do SQL Server como o tipo de implantação, SQL Server 2019 como
a Versão e Novo Cluster de Serviço Kubernetes do Azure como o destino
de Implantação:
Ao implantar um cluster de Big Data pela primeira vez, também deve haver
um aviso exibido na parte superior da janela, dizendo que certas ferramentas
necessárias ainda não foram instaladas. Se alguma ferramenta estiver
faltando, conforme mostrado na captura de tela anterior, clique em Instalar
ferramentas para corrigir isso e aguarde alguns minutos até que a instalação
seja concluída.
b) Localização: eastus
East US éo local padrão no modelo; locais adicionais com a versão do AKS
em oferta estão disponíveis. Você pode acessar a lista completa clicando
em Exibir locais disponíveis do Azure.
Ponta
Geralmente, o local deve ser determinado com base em sua proximidade com
o local onde os serviços que você planeja hospedar no Azure serão usados
— por exemplo, a proximidade com os usuários finais, se os serviços forem
acessados pelos usuários finais diretamente; ou, a proximidade do seu local
local, se a sua organização for o consumidor principal.
Para fins de desenvolvimento e teste, o local padrão deve ser bom o
suficiente, mas você pode selecionar qualquer outro local, se preferir:
b) Contagem de VMs: 5
c) Tamanho da VM: Standard_E8s_v3
10. O Bloco de Anotações Python agora deve estar aberto no ADS. Usando o
atalho Ctrl + S no teclado ou selecionando Salvar no menu Arquivo, salve o
Bloco de Anotações na pasta.deploy-bdc-aksC:\ETL-with-Azure\Chapter03\BDC
Ponta
11. Se a execução for concluída com êxito, um novo hiperlink Clique aqui para
se conectar à instância mestra do SQL Server deverá aparecer na parte
inferior do Bloco de Anotações, conforme mostrado na captura de tela a
seguir:
Se esse não for o caso, você pode tentar seguir o link para o item
problemático e executar uma operação de solução de problemas para ele.
14. Retorne à guia ADS com as propriedades do Cluster de Big Data. Como
você pode ver na guia ADS mostrada na Figura 3.7, todos os pontos de
extremidade usam o protocolo HTTP seguro (HTTPS) em seus URLs
(Uniform Resource Locators); no entanto, nenhum certificado é instalado
nesses pontos de extremidade por padrão. Isso impede que os aplicativos
cliente se conectem aos pontos de extremidade com segurança. Na seção
Blocos de Anotações da guia atual, clique em Guia do SQL Server 2019 para
abrir o Bloco de Anotações Jupyter de Operações e Suporte de Clusters
de Big Data do SQL Server 2019. Este Bloco de Anotações fornece acesso
a vários Blocos de Anotações adicionais que você pode usar para gerenciar
seus Clusters de Big Data do SQL Server 2019 — por exemplo, para
monitorar, analisar, solucionar problemas e reparar a instalação.
15. Na seção Capítulos do Bloco de Anotações, clique em Gerenciamento
de Certificados para abrir o conjunto de blocos de anotações usados para
o Gerenciamento de Certificados.
16. Na seção Blocos de Anotações neste Capítulo do bloco de
anotações Gerenciamento de Certificados, localize o link CER100 -
Configurar Cluster com Certificados Autoassinados e siga o link para
abrir o Bloco de Anotações correspondente.
Ponta
Se, por acaso, você ficar preso ao executar os blocos de anotações e não
conseguir resolver um problema específico, entre em contato com o Suporte
da Microsoft; eles podem ajudá-lo ainda mais.
Observação importante
Como funciona...
Você acabou de implantar um cluster de Big Data do SQL Server 2019 no
Azure, usando o AKS para hospedá-lo. Você usará esse recurso posteriormente
neste capítulo para carregar dados na nuvem, processá-los e recuperar os
resultados a serem carregados em um banco de dados local.
Observação importante
Observação importante
Nem todos os recursos do Azure podem ser suspensos — alguns só podem ser
desalocados quando o recurso do qual fazem parte é desalocado e outros só
serão desalocados quando o recurso do qual fazem parte for excluído ou quando
eles próprios forem removidos completamente.
Preparando-se
Você vai entrar em sua assinatura do Azure, localizar as VMs usadas pelo seu
Cluster de Big Data e suspendê-las. Você vai terminar a receita aprendendo a
iniciá-los novamente.
Como fazer...
Use seu navegador de internet favorito para fazer logon no portal do Azure
em https://portal.azure.com/.
2. Na lista de todos os seus recursos, localize o VMSS (VMSS) que você criou
anteriormente (deve haver apenas um) e siga o link para a página Visão
geral do recurso.
5. Para iniciar o Cluster de Big Data novamente, inicie cada uma das VMs na
página Instâncias ou inicie o VMSS inteiro na página Visão geral.
Clique em Iniciar e as VMs agora devem retornar aos seus estados salvos.
Dependendo do tamanho das máquinas, deve levar cerca de um minuto para
que elas retornem a um estado de Execução.
Observação importante
Depois que as VMs voltarem a ficar online, ainda pode levar alguns minutos
até que os serviços hospedados nelas também fiquem online. Você pode
monitorá-los no ADS, conectando-se ao Cluster de Big Data. No
painel Conexões, em Clusters de Big Data do SQL Server, clique com o
botão direito do mouse no nó que representa sua instância de Cluster de Big
Data e selecione Gerenciar no menu de atalho.
Como funciona...
Ao alocar recursos do Azure, todas as operações em execução neles
serão suspensas (ou, dependendo do recurso individual, interrompidas
completamente). Isso, é claro, também afeta todos os serviços e operações que
dependem dos recursos desalocados — por exemplo, quaisquer serviços ou
processos dependentes podem falhar quando o recurso fica indisponível. Portanto,
você deve ter cuidado ao interromper os serviços do Azure ou alocar recursos.
Quando um recurso é deslocalizado, ele não usará mais alguns dos recursos
atribuídos a ele (como CPUs ou memória do sistema), mas ainda poderá usar
outros recursos (por exemplo, espaço em disco). Os recursos suspensos e
desalocados não contribuem mais para o custo das assinaturas do Azure,
enquanto os recursos que não podem ser suspensos (e, portanto, não
desalocados) permanecerão ativos, o que será refletido no custo da assinatura.
Ponta
Mais informações sobre os custos associados ao uso do Azure estão disponíveis
na documentação online, em https://azure.microsoft.com/en-us/pricing/.
Preparando-se
Na receita a seguir, você criará uma tabela externa em sua instância do SQL
Server do Azure usando o assistente Criar Tabela Externa. O assistente está
disponível na extensão Data Virtualization.ADS
Como fazer...
Você criará objetos de armazenamento de dados no Cluster de Big Data, tanto no
sentido físico, criando um novo banco de dados do SQL Server do Azure e pastas
HDFS, quanto no sentido lógico, criando uma tabela externa no banco de dados
recém-criado.
1. Inicie o ADS, a menos que ele já esteja aberto, e conecte-se ao cluster de Big
Data criado anteriormente neste capítulo. Ele deve ser listado na
guia Conexões, em Clusters de Big Data do SQL Server.
5. GO
GO
CopyExplain
Você vai usar esse banco de dados para hospedar os dados das receitas
deste capítulo.
7. Na guia Conexões, clique com o botão direito do mouse no nó HDFS e
selecione Novo diretório no menu de atalho:
Uma vez que o arquivo tenha sido carregado, você pode disponibilizar seu
conteúdo para o banco de dados através de uma tabela externa.Staging
10. Clique com o botão direito do mouse na pasta novamente e, desta vez,
selecione Criar tabela externa a partir de arquivos CSV para iniciar o
assistente Criar tabela externa:
11. The first 50 rows of the file are displayed so that you can verify whether the
column delimiters were recognized correctly:
The same sample of rows is also used to determine the table schema—the
column data types and dimensions, and whether a column allows values or
not.NULL
Important note
If the first 50 rows do not contain a representative set of rows, the metadata
might be determined incorrectly. Fortunately, you can make the necessary
adjustments later before the table is actually created.
Typically, if a file uses standard delimiters—a comma () as the column
delimiter; quotation marks for text delimiters (); and the carriage-return line-
feed combination as the row delimiter—the structure of the file should be
recognized correctly.,"
12. On the Modify Columns page, you are presented with the external table
schema as it was determined from the row sample:
In this particular case, column data types were determined correctly as . None
of the columns should allow . However, the length of the column will have to
be adjusted later (it should be 256 characters,
not 50).nvarcharNULLsEmailAddress
Important note
Click Next to continue.
The automatically generated T-SQL script should now be open in a new ADS
tab.
14. In the script, locate the definition of the external table, and in it the definition of
the column:dbo.NewPeopleEmailAddress
Figure 3.22 – The T-SQL script used to create the external table
15. Execute the script by clicking Run in the tab menu or by pressing F5 on the
keyboard to start the external table creation. By default, automatically created
scripts are placed into a new ADS tab without establishing a connection:
Figure 3.23 – The ADS connection dialog
Inspect the T-SQL script; it is divided into two parts, marked with Roman
numerals and : the first part contains T-SQL commands that you will use to
create new objects, and a few T-SQL statements to test them, and the second
part contains two commands that you should only use if you want to remove
the database objects (for instance, if you need to create them again).I.II.
18. Make sure that you are connected to the database on the server, and then
carefully execute the following commands to create the following
objects:WideWorldImporterslocalhost
19. In the Object Explorer, open another connection, this time to the master
instance of your Big Data Cluster.
For the server name, use the address that you can locate on the Big Data
Cluster overview page in ADS.SQL Server Master Instance Front-End
This T-SQL script is also divided into two parts—the first is to create the
objects, and the second is to remove them when they are no longer needed,
or if they need to be recreated.
21. Make sure that you are connected to the database on your remote SQL
Server instance, and then carefully execute the commands to create two
additional objects:Staging
22. Use the Object Explorer in SSMS to locate all the objects that you created in
this recipe. Some of the Big Data Cluster features, such as the HDFS file
store, can only be accessed through ADS.
How it works…
Você criou um novo banco de dados em sua instância remota do SQL Server e,
em seguida, criou duas tabelas externas e uma tabela de banco de
dados regular nesse novo banco de dados. Você também carregou uma amostra
de dados no armazenamento de arquivos HDFS do Cluster de Big Data. Usando
um assistente, você criou uma tabela externa com base no exemplo de dados
carregado em um arquivo simples. Essa tabela externa agora permite que você
recupere dados do armazenamento de arquivos HDFS usando T-SQL, como se os
dados fossem armazenados em uma tabela de banco de dados normal.
Preparando-se
Supomos que você já tenha clonado o repositório GitHub do livro de receitas para
sua estação de trabalho e que tenha concluído a primeira e a terceira receita deste
capítulo, intituladas Criando um cluster de Big Data do SQL Server 2019 e
Configurando um cluster de Big Data, respectivamente.
Observação importante
Como fazer...
Localize o clone do repositório GitHub do livro de receitas que você implantou em
sua estação de trabalho.
a) BDC_Load.dtsx
b) BDC_Extract.dtsx
Observação importante
Quando o pacote for aberto e validado, erros serão exibidos, informando que
o SSDT não conseguiu ler informações confidenciais do arquivo de pacote.
Você pode ignorar esses erros com segurança, pois fornecerá todas as
informações confidenciais mais tarde.
Isso fornece uma conexão com o banco de dados na instância local do SQL
Server.WideWorldImporters
a) RequireFullName: false
b) Executável: curl
c) Nome de usuário: admin
d) Senha: A senha que você usou para a conta quando implantou a instância
do Big Data Clusteradmin
Observação importante
a) Tipo de conexão: OLE DB
b) Conexão: Staging_BDC_Oledb
c) SQLSourceType: Direct input
Ponta
Salve a solução.
Salve a solução.
25. Se você tiver seguido as instruções corretamente, o pacote agora deve estar
pronto para uma execução de teste.SSIS
Primeiro, alterne para o SSMS e use as consultas nos scripts T-SQL e T-SQL
usados anteriormente na receita Configurando um cluster de Big Data
para verificar o estado dos dados nos bancos de dados local e
remoto:Chapter03_OnPremises.sqlChapter03_Cloud.sql
a) No banco de dados, a tabela ainda deve estar vazia, pois você não
carregou nenhum dado no banco de dados
local.WideWorldImportersApplication.UnknownPeople
Como funciona...
Você adicionou tarefas ausentes ao pacote SSIS existente e criou um novo
gerenciador de conexões que se conecta ao seu Cluster de Big Data, que você
usou em um fluxo de dados SSIS.
Você carregou dados na tabela de banco de dados remoto usando um fluxo de
dados regular e carregou dados representados por um arquivo simples no
armazenamento de arquivos HDFS do Cluster de Big Data usando o utilitário de
linha de comando curl.
O objetivo deste pacote é reduzir o tamanho dos dados que realmente precisam
ser transferidos da fonte externa para o banco de dados de linha de negócios,
restringindo o conjunto de fontes remotas para conter apenas dados que ainda
não existem no banco de dados local.
Preparando-se
Essa receita pressupõe que você tenha concluído a receita anterior neste capítulo,
intitulada Carregando dados em um cluster de Big Data, e que os dados
esperados estejam disponíveis na tabela externa e na tabela de banco de dados
na instância do cluster de Big Data.dbo.NewPeopledbo.ExistingPeople
Como fazer...
Nesta receita, você usará o ADS para simular um processo hospedado em sua
instância de Cluster de Big Data e, em seguida, usará o SSMS para verificar os
resultados. Em circunstâncias normais, a parte da operação executada no ADS
seria executada automaticamente — por outro pacote SSIS ou outro fluxo de
controle no mesmo pacote — ou seria executada por outro aplicativo (por
exemplo, um trabalho agendado do Spark configurado no cluster de Big Data).
Neste exemplo, queremos mostrar como o processamento do Spark pode ser
executado interativamente e também queremos que você examine os resultados
assim que eles estiverem prontos. A maioria das atividades de desenvolvimento
nesta receita ocorrerá em SSDT.
Observação importante
Se você alterar o kernel usado pela guia ADS ativa para qualquer outra e, em
seguida, voltar para o PySpark, os recursos subjacentes deverão ser
recarregados, para que a próxima tentativa de executar a célula seja bem-
sucedida.
Observação importante
5. No SSMS ou no ADS, abra o script T-SQL que você usou nas receitas
anteriores deste capítulo. Conecte-se ao banco de dados em sua instância de
Cluster de Big Data.Chapter03_Cloud.sqlStaging
Salve a solução.
Como você pode ver a partir disso, e da receita anterior, quando se trata de
recuperação de dados (por exemplo, no SSIS), os dados em clusters de Big Data
são expostos da maneira padrão — como dados relacionais — mesmo que seu
armazenamento físico, ou os meios usados para processá-los, sejam de natureza
não relacional. Da perspectiva dos fluxos de dados do SSIS especificamente e da
perspectiva do data warehouse e do ETL (Extract, Transform, Load) em geral,
essa abordagem ao acesso a dados realmente permite uma transição
(principalmente) perfeita entre soluções de gerenciamento de dados locais e
baseadas em nuvem.
Vamos começar!
Preparando-se
Para acompanhar esta receita, você precisará do seguinte:
4. Adicione um fluxo de dados ao pacote e vá para dentro dele. Agora você verá
algumas transformações na caixa de ferramentas do SSIS, conforme
mostrado na captura de tela a seguir:
Figura 4.2 – As opções de transformação do Azure
Fica assim concluída esta receita. Agora você instalou o Azure Feature Pack no
Visual Studio.
Como funciona...
O SSIS agora está pronto para se conectar ao Azure. Isso é útil quando
queremos conectar nossas ETLs locais aos recursos do Azure. As receitas a
seguir usarão os recursos do Azure disponíveis no SSIS.
Como fazer...
Agora, vamos começar o processo de instalação:
3. Você deve ser redirecionado para uma página da Web que solicita que você
faça login. Se você não tiver uma conta Oracle, crie uma – é gratuito para
fazê-lo. Uma vez baixado, clique no arquivo de instalação para instalar o
arquivo. Opcionalmente, você pode alterar a pasta de destino, se desejar.
Clique em Instalar para iniciar o processo de instalação. JRE 32-bit
4. Para a versão de 64 bits do JRE, volte para a página de download e selecione
a versão de 64 bits, conforme mostrado na captura de tela a seguir:
Figura 4.4 – A opção de download de 64 bits
É isso! Agora estamos prontos para começar a usar o SSIS Azure Feature Pack!
Como funciona...
Agora que montamos o JRE, podemos executar o resto das receitas neste
capítulo.
Preparando-se
Esta receita requer que você tenha o seguinte:
JRE instalado
Como fazer...
Vamos começar:
b) Grupo de recursos: ETLInAzureCookBook.
Como funciona...
Agora estamos prontos para fazer alguma codificação! É o que faremos nas
próximas receitas.
Usaremos clusters Hadoop neste capítulo porque o SSIS usa esse tipo de cluster.
Os clusters HDInsight podem ser muito caros se os criarmos manualmente e os
deixarmos em execução contínua. Esta receita mostrará como criar um cluster sob
demanda; Este cluster será criado pouco antes de sua execução e liberado logo
após sua conclusão, a fim de reduzir custos.
Preparando-se
Esta receita requer que você tenha o seguinte:
JRE instalado
Como fazer...
Vamos começar:
Após vários minutos (15-20), a tarefa será concluída com êxito, conforme
mostrado na captura de tela a seguir:
Com isso, criamos um cluster do Azure HDInsight sob demanda. Fica assim
concluída esta receita.
Como funciona...
Criar um cluster HDInsight é apenas a primeira etapa. Ele nos permite usar
serviços como Hive ou Pig para transformar dados com muitos recursos. As
próximas receitas ensinarão como transformar dados usando os serviços do
HDInsight.
Preparando-se
Esta receita requer que você tenha o seguinte:
Como fazer...
Agora, é hora de copiar alguns dados para um contêiner em nossa conta de
armazenamento. Esses dados serão usados para fazer algumas transformações
usando o Apache Hive. Vamos começar:
FROM FactSales AS f
INNER JOIN DimDate AS d
WHERE (d.CalendarYear = 2009)
6. Volte para o fluxo de controle do pacote. Clique com o botão direito do mouse
na tarefa e selecione Executar no menu exibido.
7. Depois de concluído, vá para o Gerenciador de Armazenamento do
Azure e expanda o contêiner. Clique na pasta chamada dados. Você deve
ver o arquivo aparecer, como mostrado na captura de tela a
seguir:hivesourcesales.dat
10. Now, we are going to create a connection manager that will interact with the
HDInsight cluster we created in the Creating an on-demand Azure HDInsight
cluster recipe. From the drop-down list near
the HDInsightConnection property, select <New Connection>. Azure
HDInsight Connection Manager Editor will appear. Here, you will need to fill
in the textboxes with your cluster information, as shown in the following
screenshot. The password property is protected, so we cannot see the text
that's been entered in this textbox:
Figure 4.21 – Azure HDInsight Connection Manager Editor
Leave the other properties empty and click on OK to close the task editor.
41. Right-click on the task and execute it. After 1 or 2 minutes, the task should
complete successfully, as shown in the following screenshot:
43. Double-click on the file to open it. The file will be downloaded to your folder.
Click Yes on the security warning that appears. Then, choose Notepad (or
another text editor of your choice) to open the file, as shown in the following
screenshot.temp
The file will open, but since it's in Parquet file format, it won't make any sense
when it's read:
Close the text editor. The next recipe will show you how to read the file.
44. Now that we have transformed our data in our HDInsight cluster, we do not
need our cluster anymore. Drag and drop an Azure HDInsight Delete Cluster
Task from the SSIS toolbox. Rename it HDIDC etlinazure and attach it to the
previous task on the package's control flow.
45. Double-click on the task to open its editor and set the properties, as shown in
the following screenshot:
Figure 4.25 – Azure HDInsight Delete Cluster Task Editor
Important note
48. Now that the data has been transformed with Hive, let's read it and insert it
into a SQL Server table. From the SSIS toolbox, drag and drop an Execute
SQL Task onto the control flow. Rename it SQL Trucate SalesAgg.
Essentially, this task will be used to empty a table called SalesAgg. We
will create this table later in this recipe. Double-click on the task to open the
editor and set its properties, as shown in the following screenshot:
Important note
If you execute the task now, it will fail because we haven't created the table
yet. We will create the table later in this recipe.
51. Drag and drop a For Each Loop container onto the control flow. Rename it .
Attach it to the SQL Trucate SalesAgg table we created in Step 22.FELC
HiveDest
52. Double-click on it to open its editor. Set its properties, as shown in the
following screenshot:
e) File Format: Parquet.
59. Next, click on the Columns item in the leftmost list box. By doing this,
you should see the column definitions, as shown in the following screenshot:
Figure 4.28 – Flexible File Source Editor
64. Now, there is a finishing touch that we need to add. Remember that
our Flexible File Source has the name hardcoded? This name was set by the
hive worker. Since we had only one worker, the name is . If we had a bigger
data load and many workers, we might have many files in the blob storage,
and they might have different names. Previously, we set Foreach Loop
Container so that it stores the filename in a package variable called , but we
haven't used it yet. Later in this recipe, will use it to set up the filename in
the Flexible File Source component of the dataflow.000000_0000000_0Filename
65. In the dataflow, click anywhere in its background and go to
the Properties window to the right of the dataflow.
66. Scroll down to the Expressions property and click on the ellipsis button (…),
as shown in the following screenshot:
Figure 4.31 – The Expressions property in the Properties window
Now, go back to the control flow. Your package should look as follows:
Figure 4.33 – The completed control flow
We can now execute the package. It will take several minutes to execute since
we are creating and dropping an HDInsight cluster inside it.
70. Once the package has been executed, go to SQL Server Management
Studio, and select the table's row, as shown in the following screenshot:
Figure 4.34 – Executing the query in SSMS
Here, we can see that Hive aggregated 358,697 rows down to 1,505 and that
all the numeric columns have been summed, except for unitprice.
71. Go back into Visual Studio and promote all the connection managers to
project connection managers. This will allow reusability if or when you want to
create similar packages. To do so, right-click on each connection manager
and select Convert to project connection from the menu that appears.
72. Your connections managers will have (project) in front of their names, as
shown in the following screenshot:
Figure 4.35 – The connection managers that were used in the package
How it works…
The Hive script uses the SQL language to do the following:
First, it creates a database called ETLInAzure. It is dropped into the existing one if
one already exists.
Next, it creates an external table, meaning a table that is managed outside the
cluster. Dropping the cluster will not drop the table's data. The table points to the
blob storage file where we copied the data previously.
Then, it creates a table called SalesAgg. Again, this is an external table that points
to a container called hivedest. We will store our data into a blob called etlinazure.
Muitas das etapas nesta seção são semelhantes às etapas mostradas na receita
anterior. Se você completou todas as receitas fornecidas nas seções anteriores,
algumas delas podem ser ignoradas. Indicaremos quando for o caso.
Preparando-se
Esta receita requer que você tenha o seguinte:
Como fazer...
Agora que temos alguns dados copiados para o Azure, vamos transformá-los
usando o Apache Pig.
7. FROM FactSales AS f
13. Alguns códigos postais são . Com o Pig, eles serão interpretados como
caracteres de retorno (), o que causará problemas quando lermos o arquivo
resultante mais tarde. Por esse motivo, nos certificaremos de que os CEPs
ausentes serão colocados em um balde específico; vamos substituí-los pelo
valor. Arraste uma coluna Derivada para o fluxo de dados e renomeie-
a como DER NULL. Anexe-o ao código fonte e clique duas vezes nele para
chegar ao editor, conforme mostrado na captura de tela a
seguir:NULL\n"N/A"OLEDBSRC_Sales
Observação importante
Você deve ter notado que o tamanho do arquivo difere do formato Parquet. O
formato Parquet compacta dados por colunas. É por isso que o arquivo é
maior aqui.
Agora que temos alguns dados copiados para o Azure, vamos transformá-los
usando o Pig. O Pig é conhecido por ser uma linguagem de script muito
flexível na nuvem, já que foi construído com base na ideia de que ele pode
ingerir qualquer coisa.
Ponta
CalendarMonth:long);
SUM(Sales.SalesQuantity)));
USING PigStorage('|');
CopyExplain
40. Clique duas vezes no arquivo para abri-lo. O arquivo será baixado em sua
pasta temporária. Clique no link Abrir pasta no painel Atividades. Em
seguida, escolha o bloco de notas (ou outro editor de texto de sua escolha)
para abrir o arquivo.
41. O arquivo será aberto. Uma vez que é um formato de arquivo de texto,
podemos ver os dados transformados em oposição ao formato Parquet:
É muito importante deixar cair os recursos, uma vez que não precisamos mais
deles. Como estamos alugando esses recursos, estamos pagando por eles e
eles podem ficar muito caros se não os deixarmos cair quando não estiverem
sendo usados.
Observação importante
A maioria dos passos desta receita foram explicados em uma seção anterior.
Algumas etapas foram alteradas devido à forma como o Pig processa o
conteúdo da pasta de destino.
Agora que os dados foram transformados com o Pig, vamos lê-los e inseri-los
em uma tabela do SQL Server.
a) Conexão de arquivos: AzureStorage.
Ponta
62. Clique duas vezes nele para abrir seu editor. Defina o Gerenciador de
conexões OLE DB como cmgr_ContonsoRetailDW. Clique no
botão Novo ao lado de Nome da Tabela ou Visualizar. Uma janela Criar
Tabela será exibida. Remova o prefixo e verifique se não há espaço em
branco restante. Sua tela deve ser semelhante à seguinte:OLEDBDST
Figura 4.55 – O editor Create Table
65. Há um último toque final que precisamos acrescentar. Lembre-se de que
nossa fonte de arquivo flexível tem o nome codificado. Esse nome foi
definido pelo trabalhador do Porco, já que tínhamos apenas um trabalhador.
Se tivéssemos uma carga de dados maior e muitos trabalhadores,
poderíamos ter muitos arquivos no armazenamento de blob e eles poderiam
ter nomes diferentes. Definimos nosso Foreach Loop Container para que
ele armazene o nome do arquivo em uma variável de pacote
chamada Filename, mas ainda não o usamos. Usaremos isso para configurar
o nome do arquivo no componente Fonte de Arquivo Flexível do fluxo de
dados a seguir.part-v001-o000-r-00000
66. No fluxo de dados, clique em qualquer lugar em seu plano de fundo e vá para
a janela Propriedades à direita do fluxo de dados.
67. Role para baixo até a propriedade Expressions e clique no botão de
reticências (...), conforme mostrado na captura de tela a seguir:
Figura 4.57 – A propriedade Expressions
69. Para contornar esse problema, mais uma vez, clique em qualquer lugar no
plano de fundo do fluxo de dados e vá para a janela Propriedades à direita.
70. Defina a propriedade DelayValidation como True, conforme mostrado na
captura de tela a seguir. Isso significa que o pacote não tentará validar o fluxo
de dados quando for aberto. O fluxo de dados só será validado quando for
executado:
Agora, volte ao fluxo de controle. Seu pacote deve ter a seguinte aparência:
Figura 4.60 – O fluxo de controle completo
Aqui, podemos ver que o Pig agregou 358.697 linhas até 1.505 e que as colunas
numéricas são todas somadas, exceto o preço unitário.
Como funciona...
O Pig, ao contrário do Hive, não precisa absolutamente de bancos de dados para
transformar dados. Outra diferença é que o Hive funciona melhor com dados
estruturados, enquanto o Pig funciona melhor com dados semiestruturados. Eles
também diferem em termos da linguagem que usam: o Hive usa SQL, enquanto o
Pig usa sua própria linguagem processual.
Requisitos técnicos
As receitas neste capítulo pressupõem que você já tenha um ambiente de
desenvolvimento apropriado em sua estação de trabalho, incluindo uma instância
do SQL Server 2019, com as ferramentas de administração e desenvolvimento
instaladas. Todos esses pré-requisitos são abordados no Capítulo 1, Introdução
ao Azure e ao SSIS 2019. Você não precisa de uma assinatura do Azure para
concluir as receitas neste capítulo.
Se o uso dos recursos internos para atender a um requisito sem suporte puder
afetar negativamente a eficiência da solução, reduzir sua escalabilidade ou
aumentar sua complexidade, a personalização certamente deve ser considerada.
No SSIS, você pode implementar sua própria lógica programática usando duas
técnicas diferentes – ambas incorporadas à plataforma: fornecendo o código
personalizado em uma Tarefa de Script ou um Componente de Script ou criando
uma Tarefa Personalizada autônoma ou um Componente
Personalizado. O script permite personalizar um pacote SSIS como parte do
design do pacote com o script incorporado na definição do pacote. O principal
benefício do script é representado pela capacidade de resolver o problema aqui e
agora – como parte integrante do desenvolvimento de pacotes. A principal
desvantagem do script está na reutilização muito baixa, ou pelo menos muito
desajeitada, da solução resultante; Para que o mesmo script seja usado em mais
de um pacote, ele precisa ser copiado fisicamente em cada um deles.
Para tornar mais fácil para os administradores identificar operações invocadas por
um pacote SSIS específico e permitir que elas sejam distinguidas de outras
operações, você criará uma tarefa personalizada que alterará automaticamente as
cadeias de conexão usadas por um pacote SSIS em tempo de execução. A tarefa
personalizada adicionará automaticamente o nome do pacote SSIS à cadeia de
conexão.
Para criar uma tarefa de fluxo de controle personalizado, você precisa criar uma
biblioteca de classes .NET que contém uma derivada da classe base, parte do
namespace do assembly. Nessa classe, você precisa fornecer a lógica
programática necessária para executar o trabalho em tempo de execução e
fornecer a lógica que permitirá que os autores de pacotes SSIS configurem
corretamente a tarefa personalizada em tempo de
design.TaskMicrosoft.SqlServer.Dts.RuntimeMicrosoft.SqlServer.ManagedDTS.dll
Preparando-se
No Capítulo 3, Criando e usando clusters de Big Data do SQL Server 2019, você
foi instruído a criar a pasta na unidade local da estação de trabalho e clonar o
repositório GitHub do livro de receitas, localizado
em https://github.com/PacktPublishing/ETL-with-Azure-Cookbook, para o local
padrão na estação de trabalho.C:\ETL-with-Azure
1. Se você ainda não concluiu essas tarefas, faça-o agora. As instruções estão
disponíveis na seção Preparação da primeira receita, intitulada Criando um
cluster de big data do SQL Server 2019, no Capítulo 3, Criando e usando
clusters de Big Data do SQL Server 2019.
2. Dentro da pasta, crie uma pasta para este capítulo chamado , e dentro deste,
crie outra subpasta chamada .C:\ETL-with-AzureChapter05Files
3. Localize a pasta no clone local do repositório do livro de receitas e copie
todos os arquivos que ela contém para a pasta criada anteriormente.\
Chapter05\FilesC:\ETL-with-Azure\Chapter05\Files
Agora você tem todos os pré-requisitos para começar com a primeira receita.
Como fazer...
Inicie uma nova instância do Visual Studio 2019; você vai criar uma nova solução
do Visual Studio e criar uma nova biblioteca de classes .NET usando alinguagem
de programação C#:
1. Na caixa de diálogo Abrir recente / Introdução, selecione Criar um novo
projeto.
2. Na caixa de diálogo Criar um novo projeto, insira C# como a
linguagem, Windows como a plataforma, Biblioteca como o tipo de projeto e,
em seguida, selecione o modelo Biblioteca de Classes (.NET Framework) e
clique em Avançar para continuar:
a) Nome do projeto: ApplicationName
b) Nome da solução: SSISCustomization
Salve o solution.
Salve o projeto.
Salve o project.
Ponta
Salve o solution.
9. No Gerenciador de Soluções, no projeto ApplicationName, clique com o
botão direito do mouse em Referências e selecione Adicionar
Referência... no menu de atalho.
10. No Gerenciador de Referência, em Assemblies/Extensões, verifique as
seguintes bibliotecas:
a) Microsoft.SqlServer.Dts.Design
b) Microsoft.SqlServer.ManagedDTS
Salve a solução.
11. Use o Windows Explorer para navegar até a pasta no clone local do
repositório GitHub do livro de receitas, localize o arquivo e abra-o em um
editor de texto (por exemplo, no Bloco de Notas).\Chapter05\
ScriptsChapter05_ApplicationNameTask.txt
Ponta
using System.Data.Common;
CopyExplain
19. Description = "Assign SSIS Package Name as Application Name to Connection Strings.",
23. )]
25. Adicione uma linha vazia após os membros públicos e substitua o método
digitando no editor, pressionando a barra de espaço ou Tab no teclado e
selecionando o método na lista de métodos
substituíveis.InitializeTaskoverride
this.ApplicationName = String.Empty;
this.IsVerbose = true;
this.ResolveSystemVariables(ref variableDispenser);
refTracker);
CopyExplain
28. {
30. UNRESOLVED_APPLICATION_NAME_MESSAGE,
33. }
return DTSExecResult.Success;
CopyExplain
a) ResolveSystemVariables
b) GetApplicationName
c) GetConnectionManagerType
d) GetEnhancedConnectionString
e) FireInformation
As definições de método estão listadas no arquivo, abaixo do
comentário.Chapter05_ApplicationNameTask.txtPrivate Methods (to be placed
inside the main class)
36. Logo abaixo da classe (ou seja, fora da classe), copie e cole a enumeração
do arquivo de texto:ApplicationNameTaskApplicationNameConnectionManagerType
37. internal enum ConnectionManagerType : Byte
38. {
39. Unsupported = 0,
40. OleDb = 1,
41. AdoNet = 2,
42. ODBC = 3
}
CopyExplain
43. Salve a solução e, em seguida, compile o projeto no modo de depuração
pressionando Ctrl + B no teclado ou selecionando Build ApplicationName no
menu Build.
44. Depois que a compilação de depuração for concluída com êxito, altere a
configuração para Release selecionando essa opção na caixa de
listagem Configurações de Solução na barra de ferramentas do
Visual Studio:
Como funciona...
Você acabou de projetar uma tarefa personalizada SSIS muito simples, mas
eficaz. Quando usada em um pacote SSIS, essa tarefa alterará as cadeias de
conexão usadas pelos gerenciadores de conexões do pacote ao se conectar a
armazenamentos de dados com suporte.
Quando essa tarefa é usada em um pacote SSIS, cada cadeia de conexão inclui o
nome do pacote, que um armazenamento de dados compatível vai pegar e expor
por meio de uma variedade de exibições e funções do sistema. Isso deve tornar
muito mais fácil para os administradores distinguir entre as operações executadas
nos bancos de dados pelos pacotes do SSIS usando essa tarefa e quaisquer
outras operações simultâneas.
Criando um único valor de hash com base nos valores de todas as colunas na
linha de entrada e comparando apenas esse único valor com o armazenado na
tabela de destino, o uso de recursos pode ser reduzido significativamente. É claro
que os valores de hash são de tamanho restrito e nenhum dos algoritmos
normalmente usados para calculá-los pode garantir que dois conjuntos diferentes
de valores de origem não produzam o mesmo valor de hash.
Ponta
Você pode encontrar mais informações sobre , o algoritmo usado nesta receita e
outros algoritmos disponíveis no .NET Framework na documentação online em,
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hashalgo
rithm.SHA1
Preparando-se
Esta receita pressupõe que você tenha concluído a receita anterior neste capítulo,
intitulado Projetando uma tarefa de fluxo de controle personalizada ou, pelo
menos, concluído as etapas 1 a 4 dessa receita.
Como fazer...
Verifique se a solução SSISCustomization.sln está aberta no Visual Studio 2019
em sua estação de trabalho. Você adicionará outro projeto à mesma solução, o
que permitirá manter essas duas personalizações do SSIS como parte da mesma
solução:
Salve a solução.
a) Microsoft.SQLServer.DTSPipelineWrap
b) Microsoft.SQLServer.PipelineHost
c) Microsoft.SQLServer.DTSRuntimeWrap
Ponta
9. using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using System.Text;
CopyExplain
16. Modifique a definição de classe para que ela derive a classe
base:ApplicationNameTaskPipelineComponent
public class RowHashTransformation : PipelineComponent
CopyExplain
25. )]
This attribute will allow the SSIS runtime, as well as the SSIS development
environment, to understand how the component is to be used in the data flow.
26. Copy and paste the following items from the text file into the class definition
(each group is marked with a corresponding comment line):
a) Private constants – the fixed values used throughout the class definition
are available in one place.
b) Private variables – the variables used at the class level are also defined in
one place.
Save the solution.
27. Add an empty line after the private variables and override the method by
typing into the editor, pressing the spacebar or Tab on the keyboard, and then
selecting the corresponding method from the list of overridable methods.
Complete the method definition by copying and pasting the source code from
the text file:ProvideComponentPropertiesoverride
28. base.ProvideComponentProperties();
isInternal.Value = true;
CopyExplain
A single input, and a single output, synchronized with the input, are created
when the component is added to the data flow.
Use the same approach as you used in Step 12 to override the method, and
add the source code from the text file:Validate
if (input == null ||
ComponentMetaData.InputCollection.Count == 0)
ComponentMetaData.FireWarning(0, ComponentMetaData.Name,
return DTSValidationStatus.VS_ISBROKEN;
else
{
ComponentMetaData.FireWarning(0, ComponentMetaData.Name,
return DTSValidationStatus.VS_ISBROKEN;
}
if (input.InputColumnCollection.Count == 0)
{
ComponentMetaData.FireWarning(0, ComponentMetaData.Name,
return DTSValidationStatus.VS_ISVALID;
}
if (ComponentMetaData.OutputCollection.Count > 1)
ComponentMetaData.FireWarning(0, ComponentMetaData.Name,
return DTSValidationStatus.VS_ISBROKEN;
return base.Validate();
CopyExplain
At design time, this method will be used by Visual Studio to help the author of
the SSIS package to correctly configure the component. At runtime, the
method will allow the SSIS execution engine to determine whether the
component can be executed as intended.
Tip
Of course, in neither case does the successful result of the validation mean
that the component will deliver the expected result. However, you should use
this method to check the settings and properties of the component that are, or
might be, relevant to the execution of the operations that you designed.
Keep in mind that the methods used to determine the state of the custom
component represent your only way of communicating your intentions to the
authors of SSIS packages who are using this component. From their
perspective, if the validation succeeds, it is reasonable to expect that the
execution will succeed as well. Think about what could go wrong in the
execution of the custom operations, and try to prevent it by reporting any
relevant inconsistencies.
47. Override the method by copying its definition from the text file:PreExecute
48. IDTSInput100 input = ComponentMetaData.InputCollection[INPUT_NAME];
51. {
52. _columnCollection.Add(inputColumn);
53. }
base.PreExecute();
CopyExplain
This method is used to simplify access to the pipeline metadata by storing the
essential properties of the pipeline columns in a variable for later use.
Compared to the property, which provides access to all of the component's
metadata, the private variable will only contain the subset of metadata related
to the component's input columns.PipelineComponent.ComponentMetaData
Tip
You can reduce the size of this variable even further by using it to store only
the input column properties that are actually required by
the and methods.ProcessInputGetColumnValueBytes
output.OutputColumnCollection[ROW_HASH_COLUMN_NAME];
58. Int32 rowHashColumnIndex = BufferManager.FindColumnByLineageID(input.Buffer,
rowHashColumn.LineageID);
60. {
c.LineageID))
63. {
input.InputColumnCollection.GetObjectIndexByID(inputColumn.ID);
inputColumnIndex));
66. }
}
CopyExplain
68. Add the following private methods to the component class by copying their
definitions from the text file:
a) GetColumnValueBytes
b) ComputeHash
a) OnInputPathAttached
b) OnInputPathDetached
c) OnOutputPathAttached
d) OnDeletingInputColumn
a) InsertInput
b) InsertOutput
c) InsertOutputColumnAt
d) DeleteInput
e) DeleteOutput
f) DeleteOutputColumn
70. Build the project using the Debug configuration. If any errors are raised,
inspect the error messages, make the appropriate corrections, and repeat the
build.
71. Once the debug build has succeeded, change the configuration to Release,
and build the solution.
How it works…
You have designed an SSIS data flow transformation that can be used to simplify
change management in data warehousing solutions – namely, to determine which
rows that already exist in the destination table really need to be updated. It uses a
hash value to determine whether the new values are different from the existing
ones, without actually comparing each destination column value with the
corresponding source column value.
The programmatic logic of this custom component is divided into design-time
methods that will be used by Visual Studio during SSIS package
development and runtime methods that will be used by the SSIS runtime during
package execution.
At design time, the following event handlers will assist the developer of the SSIS
package in configuring the component as intended, as well as helping them to
prevent a fatal misconfiguration that might require them to remove the component
from the data flow altogether and start over:
OnInputPathAttached: The method is called when the data path from another
component is connected to this component's input.
OnInputPathDetached: The method is called when the data path to the
component's input is detached.
OnOutputPathAttached: The method is called when this component's output path
is attached to the input of another component.
OnDeletingInputColumn: The method is called when the author of the SSIS
package attempts to remove an input column.
The following methods will also be used at design time, assisting the SSIS
package developer in successfully completing the configuration of the component's
inputs and outputs:
InsertInput: This method is called when the author of the SSIS package
attempts to create a new input.
InsertOutput: This method is called when the author of the SSIS package
attempts to create a new output.
InsertOutputColumnAt: This method is called when the author of the SSIS
package attempts to create a new output column.
DeleteInput: This method is called when the author of the SSIS package
attempts to remove an input.
DeleteOutput: This method is called when the author of the SSIS package
attempts to remove an output.
DeleteOutputColumn: This method is called when the author of the SSIS
package attempts to remove an output column.
In this particular transformation, most of these methods simply raise exceptions,
and with this, effectively prevent the base operations from being executed. Each
exception contains a message that will help the developer of the SSIS package to
understand how the component should be configured.
The following methods contain the logic needed to compute the hash value:
In the recipe entitled Deploying SSIS customizations in this chapter, you are going
to use a Conditional Split transformation in the data flow to compare the calculated
hash value with the existing value of the corresponding row extracted from the
destination table. If the hash value that was stored in the destination table during a
previous run is different from the hash value calculated during this execution, this
means that at least the value of one of the columns is different, and therefore
qualifies the row for the update operation. Based on this, the Conditional Split
transformation only redirects the changed rows to the intended destination
component; rows that have not changed since the last execution are not used in
the rest of the data flow.
There's more…
The algorithm used to calculate the hash value guarantees that even a minute
difference in source values will be reflected in a dramatic difference in the result
value. Of course, if the 20-byte data space used by the algorithm might not provide
the accuracy required in your particular business case, you should replace it with a
different one.
Simply replace the class in the method with one that better suits your needs – for
instance, the class. After replacing the algorithm, you will also have to adjust the
length of the defined in the method, and the length of the columns in the , ,
and tables of
the database.SHA1ManagedComputeHashSHA256ManagedrowHashColumnProvideComponentPro
pertiesRowHashDW.PurchaseOrdersETL.PurchaseOrders_NewETL.PurchaseOrders_Modified
WideWorldAnalysis
Preparando-se
Essa receita depende dos resultados das duas receitas anteriores, Projetando
uma tarefa de fluxo de controle personalizada e Projetando um componente de
fluxo de dados personalizado, neste capítulo. Você precisa completar ambas as
receitas anteriores com sucesso antes de completar esta receita.
Como fazer...
Você iniciará essas tarefas no sistema de arquivos da estação de trabalho e, em
seguida, continuará no SSDT concluindo uma solução SSIS existente:
1. Use o Windows Explorer para localizar a pasta e, nela, o arquivo. Clique com
o botão direito do mouse no arquivo e selecione Editar no menu de atalho
para abri-lo no editor de arquivos em lotes padrão. Inspecione os
comandos. C:\ETL-with-Azure\Chapter05\FilesDeployCustomizations.bat
Observação importante
4. Abra o pacote:ApplicationNameTaskTest.dtsx
Figura 5.8 – O fluxo de controle ApplicationNameTaskTest.dtsx
Observação importante
Observação importante
Se, por algum motivo, a tarefa estiver ausente, clique com o botão direito do
mouse na tela vazia da Caixa de Ferramentas SSIS e selecione Atualizar
Barra de Ferramentas no menu de atalho para recarregar as Tarefas de
Fluxo de Controle disponíveis.
Observação importante
Não é possível criar uma tarefa a partir de XML para a tarefa "", digite ""
devido ao erro 0x80070057 "O parâmetro está incorreto".
Você pode encontrar mais informações sobre reparos do SQL Server online,
no artigo de documentação intitulado Reparar uma instalação falha do SQL
Server, em https://docs.microsoft.com/en-us/sql/database-engine/install-
windows/repair-a-failed-sql-server-installation.
10. Se você tentar abrir o editor desta tarefa (por exemplo, clicando duas vezes
nele), a seguinte mensagem será exibida, informando que nenhum editor foi
fornecido para essa tarefa específica:
Esta tarefa não tem um editor personalizado. Use a janela Propriedades para
editar as propriedades desta tarefa.
Observação importante
Desta vez, a primeira consulta deve retornar três linhas, uma para cada
conexão, e a coluna agora deve conter o nome do pacote em todos os três
casos.program_name
Você pode ver que o pacote começa com uma Tarefa Executar SQL usada
para truncar as duas tabelas de preparo no banco de dados de destino,
seguida por dois fluxos de dados e outra Tarefa Executar
SQL.WideWorldAnalysis
Observação importante
Ponta
Ponta
O Editor Avançado é usado por padrão para todos os componentes que não
têm um editor personalizado definido. Se preferir que um editor personalizado
seja usado, você pode criar um como uma biblioteca de classes separada,
associá-lo ao componente em tempo de design e implantá-lo junto com o
componente.
Salve o pacote.
Como funciona...
Agora você implantou a tarefa personalizada, bem como o componente
personalizado criado anteriormente neste capítulo na instância local do SQL
Server. Para implantar os componentes em outros ambientes, copie os arquivos
para cada ambiente de destino, ajuste o arquivo de comando para que os
comandos façam referência às pastas corretas e execute-
o.DeployApplicationNameTask.bat
Ponta
Observação importante
Se a atualização não puder ser concluída com êxito, o componente, bem
como o pacote SSIS que o implementa, poderá ser deixado em um estado
inutilizável.
Preparando-se
Essa receita depende dos resultados de duas receitas anteriores neste
capítulo, Projetando um componente de fluxo de dados
personalizado e Implantando personalizações do SSIS, que precisam ser
concluídas antes que você possa começar a trabalhar nessa receita.
Como fazer...
A solução deve estar aberta no Visual Studio:SSISCustomization.sln
2. Agora você fará alterações na definição de classe que são necessárias para
adicionar novas funcionalidades de tempo de design e tempo de execução e
para fazer alterações nas existentes. Você também fornecerá os meios para
atualizar a versão anterior do componente para a nova versão.
3. Comece por alterar a definição; Adicione as informações da nova versão ou
substitua o atributo inteiro:DtsPipelineComponentAttribute
4. [DtsPipelineComponentAttribute(
5. ComponentType = ComponentType.Transform,
8. NoEditor = false,
9. RequiredProductLevel = DTSProductLevel.DTSPL_NONE,
10. CurrentVersion = 2
)]
CopyExplain
11. Adicione mais duas constantes privadas; Você pode colocá-los abaixo dos
existentes:
12. private const String COLUMN_ORDER_CUSTOM_PROPERTY_NAME = "Ordinal";
Salve a solução.
16. {
}
CopyExplain
Substitua-o pela versão estendida, localizada no arquivo, abaixo do
comentário.Chapter05_RowHashTransformation_Upgrade.txtValidate - extend
input column count check
22. {
DER_CUSTOM_PROPERTY_NAME].Value, inputColumn);
}
CopyExplain
c.LineageID))
CopyExplain
Este:
base.ReinitializeMetaData();
CopyExplain
27. Em seguida, substitua o método base usando a seguinte
definição:PerformUpgrade
28. DtsPipelineComponentAttribute pipelineComponentAttribute =
(DtsPipelineComponentAttribute)Attribute.GetCustomAttribute(this.GetType(),
typeof(DtsPipelineComponentAttribute), false);
31. {
32. this.CreateInputCustomProperties();
33. }
ComponentMetaData.Version = componentLatestVersion;
CopyExplain
36. {
}
CopyExplain
Altere o loop para que ele agora inclua a criação da propriedade
personalizada da coluna de entrada:
input.SetUsageType(inputColumnLineageID, DTSUsageType.UT_READONLY);
this.CreateInputColumnCustomProperties(n, inputColumnLineageID);
}
CopyExplain
39. Adicione os três novos métodos privados a seguir à definição de classe; Você
pode colocá-los abaixo dos métodos privados existentes:
a) InputColumnCustomPropertyExists
b) CreateInputCustomProperties
c) CreateInputColumnCustomProperties
Salve a solução.
Se o pacote for fechado, o componente será atualizado assim que você abri-
lo.
Se você seguiu as instruções nesta e nas receitas anteriores, a atualização
deve ter sucesso sem problemas. No entanto, em caso de erros, inspecione
as mensagens de erro, faça as correções necessárias e repita a implantação.
Observação importante
43. Depois que a atualização for bem-sucedida, abra o fluxo de dados e clique
duas vezes na transformação Hash de Linha para revisar seu estado. Na
guia Colunas de Entrada, não deve haver alterações. As configurações que
você usou quando editou o componente pela última vez ainda devem estar
em vigor. Na guia Propriedades de Entrada e Saída, expanda o
nó RowHashInput, sob ele o nó Colunas de Entrada e selecione uma das
colunas de entrada:Load Staging Tables
Figure 5.12 – Locating the new input column custom property
44. Scroll down the input column property list in the right column. At the bottom, in
the Custom Properties section, you should see the Ordinal input column
custom property. The authors of SSIS packages can now use this property to
specify the order in which the columns should be processed when calculating
the row hash value.
45. Para se divertir, alterne os valores ordinais de duas colunas de sua escolha.
46. Quando estiver pronto, clique em OK para confirmar as configurações. Se os
valores ordinais não forem exclusivos, um erro será relatado, impedindo que
você execute o pacote até que os valores sejam corrigidos. Salve a solução.
47. Execute o pacote no modo de depuração e observe o fluxo de dados
das Tabelas de Preparo de Carga. Observe os resultados da execução:
Como funciona...
Você implementou uma atualização de um componente de fluxo de dados
personalizado. Você fez as alterações necessárias na definição do componente
para introduzir novos recursos e alterar o comportamento de alguns dos recursos
existentes. Você também implementou o método da classe base que facilita uma
atualização automatizada de uma versão mais antiga do componente no ambiente
de destino.PerformUpgradePipelineComponent
Preparando-se
Essa receita pressupõe que você tenha acesso a uma assinatura do Azure. Pode
ser uma avaliação gratuita, conforme descrito na receita Criando uma assinatura
do Azure, no Capítulo 1, Introdução ao Azure e ao SSIS 2019.
Como fazer...
Vamos começar a criar o data factory!
Como funciona...
Como dito anteriormente, uma data factory é composta de muitos elementos. O
que fizemos na receita foi criar a casca de uma fábrica. A próxima receita copiará
alguns dados de um banco de dados SQL do Azure para uma conta de
armazenamento.
Preparando-se
Essa receita pressupõe que você tenha acesso a uma assinatura do Azure. Pode
ser uma avaliação gratuita, conforme descrito na receita Criando uma assinatura
do Azure, no Capítulo 1, Introdução ao Azure e ao SSIS 2019.
Como fazer...
Esta receita nos obriga a criar os seguintes itens, que representam o
encanamento de nossa fábrica:
c) Quatro conjuntos de dados: dois para os arquivos de internet e mais dois para
os arquivos de destino na conta de armazenamento.
Uma vez que o encanamento está no lugar, somos capazes de criar uma
tubulação. Então, vamos começar pelo encanamento!
12. From the New dataset blade that appears at the right of the screen, select
the File tab and HTTP as shown in the following screenshot. Click
on Continue:
Figure 6.15 – Data Factory – add an HTTP dataset
16. The data store read settings appear. Click on Finish. Your screen should look
like the following screenshot:
Figure 6.18 – Data Factory – HTTP dataset properties schema imported
17. We will now repeat the same steps (11 to 15) for the State Income Data. Add
a new dataset, name it DS_ StateIncomeDataHTTP, use
LNK_StateIncomeData for Linked service, From
connection/store for Import schema, and finally, GET for Request method.
On the Connection tab, make sure you have checked First row as header.
18. Import the schema. You should have 153 columns.
19. Next, we're going to create two datasets for the sinks. Add a new Azure Blob
Storage dataset, and this time, choose Parquet as the file
format. Parquet compresses data by column. It makes files smaller and data
retrieval from them very efficient. Name the
dataset DS_StateAbbreviationParquet, and select LNK_ETLInAzure for
the Linked service property. For the File
path, enter adf/abbreviations/stateAbbreviations.parquet. Since we do not
have a file created for now, we'll use None for the Import schema property as
shown in the following screenshot. Click OK to create the dataset:
Figure 6.19 – Data Factory – add blob dataset properties
27. Open Azure Data Explorer and navigate to the container blob. You will see
that a file called stateAbbreviations.parquet has been created as shown in
the following screenshot:adf/abbreviation
31. Click Debug at the top of the pipeline. The two copy activities will run
successfully, as shown in the following screenshot:
32. Go back into Azure Storage Explorer to verify that the file was copied
successfully, as shown in the following screenshot:
Figure 6.27 – Data Factory – new copy activity stateIncomeData parquet file
33. Now, it's time to publish our factory to ensure we will not lose anything when
we close the browser. Click on the Publish all icon at the top of the factory as
shown in the following screenshot:
34. A summary of the changes appears at the right of the factory. Click
on Publish to save the changes.
35. Within a few seconds, you will get a message telling you that the data factory
has been successfully published.
How it works…
Copying data from a URL is quite easy with Data Factory. We created a linked
service to both URLs that allowed us to download two CSV files: and . These files
were then transferred to an Azure storage account using a copy
activity.StateAbbreviationsStateIncomeData
O mapeamento de fluxos de dados é uma nova adição ao Data Factory. Eles não
faziam parte do Data Factory v2 inicial que estava disponível em julho de 2018. A
equipe do ADF adicionou os fluxos de dados de mapeamento cerca de um ano
depois. Para aqueles que estão familiarizados com SSIS, eles vão entender como
trabalhar com eles em pouco tempo.
Preparando-se
Essa receita pressupõe que você tenha acesso a uma assinatura do Azure. Pode
ser uma avaliação gratuita, conforme descrito na receita Criando uma assinatura
do Azure, no Capítulo 1, Introdução ao Azure e ao SSIS 2019. Ele também
pressupõe que você criou alguns artefatos do Data Factory, como serviços
vinculados, conjuntos de dados e assim por diante, a partir da receita
anterior, Copiando dados da Internet.
Como fazer...
OK, vamos nos aprofundar nisso!
3. Nas Propriedades Gerais, nomeie
o DFT_StateIncomeMappingDataflow de fluxo de dados, conforme
mostrado na captura de tela a seguir:
Figura 6.30 – Data Factory – nomeando um fluxo de dados de mapeamento
Figura 6.33 – Data Factory – a guia Otimizar para uma fonte no mapeamento
do fluxo de dados
12. Agora podemos ver os dados de nossa fonte de dados no painel mostrado na
captura de tela a seguir. O sinal + antes da coluna de abreviação significa
que estamos inserindo os dados:
Figure 6.36 – The Data Factory Data preview tab for a source after refreshing
in mapping data flow
13. We can change the type of the column if necessary, by clicking
on Typecast as shown in the following screenshot:
Figure 6.37 – The Data Factory Preview tab for a source with Typecast in
mapping data flow
15. There's also a Statistics button that allows us to see some basic data profiling
information on the column, as shown in the following screenshot:
Figure 6.39 – The Data Factory Preview tab for a source with the Statistics
column's data in mapping data flow
16. Click on the data flow designer. Your screen should look like the following
screenshot:
Figure 6.40 – Data Factory – add a new source in mapping data flow
18. The refreshed Data Preview tab will show us the data in the source. Select
the A02650 column and click on Statistics at the top of the Preview tab to
see its statistics. As shown in the following screenshot, the stats are based
on 1000 rows:
Figure 6.42 – The Data Factory Statistics tab for the StateIncomeData source
in mapping data flow
19. To get them for the entire data source, 27760 rows, we need to change some
settings. Click on Debug Settings at the top of the data flow. A blade appears
and we can see the settings for each item we have in our data flow so far. As
shown in the following screenshot, change Row limit for
the StateIncomeData source to 30000 and click Save at the bottom of the
blade to save our settings and close it:
Figure 6.43 – Data Factory Debug Settings for mapping data flow
Figure 6.46 – Data Factory Lookup settings for mapping data flow
Figure 6.47 – Data Factory Lookup Optimize tab for mapping data flow
24. Click the Inspect tab. There is nothing to set there. You will only notice that
the two columns we used (STATE and abbreviation) are marked as Used in
Lookup as shown in the following screenshot:
Figure 6.48 – Data Factory Lookup Inspect tab for mapping data flow
26. Next, we're going to add a parameter to our pipeline: RunID. This is useful to
relate a row inserted or updated to a specific pipeline run. Click anywhere in
the data flow designer and go to the Parameters tab. Click on + New to add a
parameter. As shown in Figure 6.51, type PipelineRunID for NAME and
leave TYPE as . string
27. Next, click on DEFAULT VALUE and the Visual expression builder will
show up. Type "No parameter value" as the default parameter value, as
shown in the following screenshot:
Figure 6.50 – Data Factory Mapping parameter Visual expression builder
29. Now, click on the + New sign after the lookup to add a Derived
Columns transform. In Derived column's settings, set Output stream
name to DERStateIncomePipelineRunID. In the Columns section,
type StateIncome and click on the textbox on the right to enter the Visual
expression builder. Type toLong(A02650) to cast the column to a long data
type. Click on Save and finish. Your screen should look like the following
screenshot:
Figure 6.52 – Data Factory Derived column's settings – add a StateIncome
column
Figure 6.53 – Data Factory Derived column's settings – add a new column
32. Click on Save and finish. As shown in the following screenshot, you should
now have added two columns:
Figure 6.55 – Data Factory Derived column's settings with two columns
33. Next, click on the + sign from the derived column transformation we just
added. This time select a Select transformation. This transformation allows us
to remove unused columns that would take up unnecessary resources at
runtime. Use SELRemoveUnusedColumns for OutputStreamName.
Remove the STATE and A02650 columns. Your screen should look like the
following screenshot:
Figure 6.58 – Data Factory Aggregates tab setting with a StateIncome column
37. We now have all the transformations we need. We are ready to insert our data
into an Azure SQL Server table. Open SQL Server Management
Studio (SSMS). Connect to the AdventureWorksLT database we created
in Chapter 2, Introducing ETL, in the recipe Creating a SQL database. Type
and run the following SQL statements. This will create a table
named SalesLT.IncoesPerStates:
38. DROP TABLE IF EXISTS [SalesLT].[IncomesPerStates];
40. (
);
CopyExplain
45. Go back to the data factory's data flow. Add a Sink named as shown in the
following screenshot:SINKSalesLT
Figure 6.60 – Data Factory – adding a sink
49. Click on OK to save the changes. Back in the data flow, uncheck the Allow
schema drift property. Go to the Settings tab and set Table
action to Truncate table as shown in the following screenshot:
Figure 6.64 – Data Factory Sink Settings tab
55. We are now presented with a screen that shows us the data flow execution
details as shown in the following screenshot:
Figure 6.69 – Data Factory pipeline mapping execution details
How it works…
We joined the data from the two sources using a lookup transform. This transform
is very efficient and usually everything is done in memory in the workers. We then
aggregated the pipeline by summing the incomes grouped by every state and
inserted it into an Azure SQL Server table.
Esta receita mostrará como isso pode ser feito facilmente com o Azure Data
Factory. Ele irá ensiná-lo a realizar ações específicas:
Preparando-se
Essa receita pressupõe que você tenha acesso a uma assinatura do Azure. Pode
ser uma avaliação gratuita, conforme descrito na receita Criando uma assinatura
do Azure, no Capítulo 1, Introdução ao Azure e ao SSIS 2019. Ele também
pressupõe que você criou um pipeline a partir da receita anterior, Movendo e
transformando dados.
Como fazer...
Vamos carregar alguns metadados!
7. '@{pipeline().Pipeline}' as Pipeline_Name,
8. '@{pipeline().RunId}' as RunId,
9. '@{pipeline().TriggerType}' as TriggerType,
16. '@{activity('ACT_CPY_StateAbbreviations').output.effectiveIntegrationRuntime}' as
effectiveIntegrationRuntime,
17. '@{activity('ACT_CPY_StateAbbreviations').output.executionDetails[0].source.type}' as
Source_Type,
18. '@{activity('ACT_CPY_StateAbbreviations').output.executionDetails[0].sink.type}' as
Sink_Type,
19. '@{activity('ACT_CPY_StateAbbreviations').output.executionDetails[0].status}' as
Execution_Status,
20. '@{activity('ACT_CPY_StateAbbreviations').output.executionDetails[0].start}' as
Activity_Start_Time
effectiveIntegrationRuntime,
33. '@{activity('ACT_CPY_StateIncomeData').output.executionDetails[0].source.type}' as
Source_Type,
34. '@{activity('ACT_CPY_StateIncomeData').output.executionDetails[0].sink.type}' as
Sink_Type,
35. '@{activity('ACT_CPY_StateIncomeData').output.executionDetails[0].status}' as
Execution_Status,
36. '@{activity('ACT_CPY_StateIncomeData').output.executionDetails[0].start}' as
CopyActivity_Start_Time
46. '@{activity('DFT_SalesLTIncomesPerStates').output.runStatus.metrics.SINKSalesLT.source
s.StateIncomeData.rowsRead}' as RowsRead,
47. '@{activity('DFT_SalesLTIncomesPerStates').output.runStatus.metrics.SINKSalesLT.rows
Written}' AS RowsWritten,
'0' AS Activity_Start_Time
CopyExplain
52. Your screen should look like the following screenshot:
Figure 6.74 – Data Factory Copy data activity source tab for the metadata
collection
Figure 6.75 – Data Factory pipeline executed with the metadata collection
activity
55. Now, go to your storage account. Navigate
to metadata / P_StateIncomeMappingDataflow. If you open the P_
StateIncomeMappingDataflow directory, you should see a CSV file
named <your run id>.csv as shown in the following screenshot:
56. Click on it and click on Edit in the blade that opens. Scroll to the right to see
the load metrics, as shown in the following screenshot:
57. Using blob storage gives us more flexibility in term of structure. If we were
using a SQL Server table, we would have to modify its structure every time we
added or removed a column in the copy activity query.
58. Go back to the pipeline we just modified – P_StateIncomeMappingDataflow.
Click on Add trigger to open the trigger menu. As shown in the following
screenshot, we have two choices: Trigger now, which will run the pipeline
outside the debug environment and New/Edit, which allows us to create or
edit a trigger:
Figure 6.78 – Trigger submenu for a pipeline
61. Now, click on Publish all to save our factory and make it available to the
production environment. A blade opens and you should see the
following Pending changes, which will be published. Click on Publish:
63. Lastly, we're going to create an alert that will send us an email if the factory
fails.
64. Click on the Monitor tab on the left side of the browser screen to enter that
section. Click on Alerts & metrics as shown in the following screenshot:
65. Click on New alert rule at the top to open the New alert rule blade at the right
of the screen. Type PipelineFails and set Severity to Sev0. Now, click
on Add criteria.
66. The Add criteria blade appears. Select the Failed pipeline runs metric.
67. The Configure alert logic pane opens. As shown in the following screenshot,
select all pipelines from DIMENSION Name and select all failure types from
the FailureType dropdown. Set Alert logic to Greater than and Threshold
count to 0. The alert will fire every time there's a failure. Set Period to Over
the last 6 hours and Frequency to Every 15 minute in the Evaluate based
on section. Click on Add criteria to save the changes:
Figure 6.84 – Configuration of the alert logic
68. Now, click on + Configure notification to open the Configure
notification blade. Type IT in both Action group name and Short name, as
shown in the following screenshot:
72. After a few seconds, we're back to the Alerts & metrics blade. We now
see that we have created an alert, as shown in the following screenshot:
Figure 6.88 – Alert created
73. To test the alert, we need to modify the pipeline to have it fail. Go back to the
pipeline. Select the ACT_CPY_WriteLoadMetadata activity. Click on
the Source tab and modify the query to get only the following query text.
Since output.executionDetails[0].end does not exist, the activity will fail:
SELECT '@{activity('ACT_CPY_StateAbbreviations').output.executionDetails[0].end}' as
Activity_End_Time
CopyExplain
74. Publish the pipeline. Once done, click on Trigger > Trigger now to execute
the pipeline outside the sandbox (debug) environment. Click on OK in
the Pipeline run blade that appears at the right of the screen to start the
pipeline execution.
75. Click on the Monitor tab at the left of the factory. Select Pipeline runs. Click
on the pipeline link as shown in the following screenshot:
76. The pipeline execution screen opens as shown in the following screenshot:
Figure 6.90 – Pipeline running
78. Don't worry if it takes time to complete. The trigger starts a new cluster and it
takes a while to start and execute the pipeline.
79. Close the data flow execution screen by clicking on the X at the top right. Back
on the pipeline run, we now see that ACT_CPY_WriteLoadMetadata failed,
as shown in the following screenshot:
Figure 6.92 – Pipeline data flow running
80. An email will be sent to the address we configured before within the next 15
minutes. Go to your mailbox and you should have received an email as shown
in the following screenshot:
81. Perfeito! Nosso alerta funciona! Agora, vamos voltar ao pipeline e corrigir a
consulta que modificamos no ACT_CPY_WriteLoadMetadata. Publique o
pipeline quando terminar.
82. Se você não quiser que o pipeline seja executado todos os dias a partir de
agora, clique na guia Gerenciar à esquerda da tela e clique em Gatilhos para
ir para a seção de gatilhos. Passe o mouse sobre o gatilho TRG_DailyLoad e
clique em Desativar (||), conforme mostrado na captura de tela a seguir:
Figura 6.94 – Desativação de um gatilho
Como funciona...
Nesta receita, recuperamos contagens de linhas do fluxo de dados de
mapeamento. Também criamos um gatilho para executar o pipeline. Em seguida,
criamos um alerta que nos enviou um e-mail indicando que o pipeline falhou.
O Azure Data Factory tem todos os componentes necessários para criar uma
solução ETL ou ELT na nuvem. O fato de agendarmos um pipeline, obtermos as
estatísticas de carga e gerarmos uma variedade de alertas torna esse serviço a
ferramenta perfeita para ingerir dados na nuvem.
Capítulo 7: Azure Databricks
O Azure Databricks se tornou a ferramenta de ETL de fato na nuvem. É uma
Plataforma Unificada de Análise de Dados, o que significa que é mais do que uma
ferramenta de ETL. Ele pode ter acesso a muitas bibliotecas que permitirão que
um engenheiro de dados ou um cientista de dados trabalhe de forma colaborativa
e execute uma gama de tarefas mais ampla; de ETL a aprendizado de máquina e
análise de IA.
Agora que temos uma ideia melhor dos componentes do Databricks, vamos nos
aprofundar nele.
Preparando-se
Se você estiver usando uma assinatura de avaliação do Azure, precisará atualizá-
la para uma assinatura Pay-As-You-Go. O Azure Databricks requer oito núcleos
de recursos de computação. A assinatura de avaliação do Azure tem apenas
quatro núcleos de recursos de computação. Se você estiver usando uma
assinatura Enterprise ou MSDN Azure, ela deverá conter recursos suficientes para
o Azure Databricks.
Observação importante
Certifique-se de remover os recursos depois de concluir todas as receitas para
reduzir o custo de sua assinatura.
Como fazer...
OK, teoria suficiente, vamos preparar nosso espaço de trabalho do Azure
Databricks:
Como funciona...
Criamos o componente básico Databricks nesta receita. Agora poderemos criar
outros artefatos, como clusters e blocos de anotações para escrever código. Como
dito anteriormente, um espaço de trabalho é um ambiente que permite
desenvolver ETLs em um ambiente do Spark.
Preparando-se
Como acontece com todas as receitas deste capítulo, você precisará atualizar sua
assinatura de avaliação do Azure para uma assinatura Pay-As-You-Go se isso
não for o que você tem usado até agora. O Azure Databricks requer oito núcleos
de recursos de computação. A assinatura de avaliação do Azure tem apenas
quatro núcleos de recursos de computação. Se você estiver usando uma
assinatura Enterprise ou MSDN Azure, ela deverá conter recursos suficientes para
o Azure Databricks.
Como fazer...
Vamos criar o nosso cluster. Ele será usado para todas as receitas restantes neste
capítulo:
Voila! Criamos com sucesso um cluster que usaremos nas receitas restantes
deste capítulo.
Como funciona...
Ter um cluster é necessário para usar nosso espaço de trabalho Databricks. Nesta
receita, criamos o menor cluster possível porque não trabalharemos com uma
grande quantidade de dados. Um tamanho de cluster maior seria usado em um
ambiente de produção.
Preparando-se
Como acontece com todas as receitas deste capítulo, você precisará atualizar sua
assinatura de avaliação do Azure para uma assinatura Pay-As-You-Go se isso for
o que você tem usado até agora. O Azure Databricks requer oito núcleos de
recursos de computação. A assinatura de avaliação do Azure tem apenas quatro
núcleos de recursos de computação. Se você estiver usando uma assinatura
Enterprise ou MSDN Azure, ela deverá conter recursos suficientes para o Azure
Databricks.
Como fazer...
OK, vamos nos aprofundar na receita!
10. dbutils.widgets.text("urlStateAbbr", "https://worldpopulationreview.com/static/states/abbr-
b) O valor padrão: é útil ter um valor padrão, pois dá uma dica para os
usuários do notebook de que tipo de valor pode ser usado.
c) O rótulo: este é o texto à esquerda do widget que descreve qual valor pode
ser inserido no widget.
13. Adicione uma nova célula e insira o seguinte código nela. Esta é uma célula
Markdown que documenta o que faremos a seguir:
14. %md
####Variables assignment
CopyExplain
15. A seguir, inicializaremos algumas variáveis com o conteúdo do widget.
Adicione outra célula e insira o código a seguir. Estamos usando a função
para inicializar as duas variáveis: e . A última linha exibirá o conteúdo da
variável sob a
célula:dbutils.widgets.get()urlStateAbbrurlStateDataurlStateData
16. urlStateAbbr = dbutils.widgets.get('urlStateAbbr')
18. urlStateData
)
CopyExplain
27. Em seguida, vamos importar as abreviações e nomes para um DataFrame
chamado :abbrDF
28. abbrDF = (spark
29. .createDataFrame(pd.read_csv(urlStateAbbr,
30. header=None),
31. abbrSchema))
display(abbrDF)
CopyExplain
33. Agora vamos adicionar mais Markdown para documentar o que estamos
fazendo a seguir – lendo o conteúdo dos dados de renda do estado:
34. %md
39. csv(urlStateData
40. .select(col("STATE").alias("state"),
41. col("A02650").cast(LongType()).
42. alias("totalIncomeAmount"))
43. .groupBy("state")
44. .sum("totalIncomeAmount")
45. .select(col("state"),
46. col("sum(totalIncomeAmount)").
47. alias("summedTotalIncomeAmount"))
48. )
display(stateDataDF)
CopyExplain
50. Agora que lemos os dois CSVs e os transformamos, vamos nos juntar a eles
para obter nosso resultado. Queremos obter um DataFrame final com três
colunas: código do estado, nome do estado e a renda total somada por
estado. O próximo código faz exatamente isso. Ele une o DataFrame ao
DataFrame usando uma junção interna nas colunas e . Em seguida,
selecionamos apenas as três colunas que estamos interessados em usar o
comando:(abbr)(stateName)
(summedTotalIncomeAmount)stateDataDFabbrDFstateabbrselect
51. stateIncomeDF = (stateDataDF.join(abbrDF, [stateDataDF.
54. col("summedTotalIncomeAmount"))
55. .orderBy(col("abbr"))
56. )
display(stateIncomeDF)
CopyExplain
Como funciona...
Os blocos de anotações Databricks são ótimos para explorar e experimentar
muitas fontes de dados. Eles também podem servir como um repositório de código
ETL e podem fazer parte de um conjunto de ferramentas de big data ou data
warehouse na nuvem.
Nesta receita, nos conectamos a uma fonte de dados pública da Internet para
recuperar dois arquivos de valores separados por vírgulas (CSV): um para as
rendas por estado por CEP e outro que contém os nomes dos estados. Nós os
unimos para anexar o nome completo do estado aos dados de renda. Em seguida,
agregamos o resultado removendo os CEPs para obter a renda total por estado.
Essa receita usava pandas, uma biblioteca Python para ler e importar dados de
uma URL. Nós o usamos porque teria sido mais complexo usar o Spark para ler
diretamente da internet e o volume de dados era muito pequeno.
https://delta.io/
Preparando-se
Se você estiver usando uma assinatura de avaliação do Azure, precisará atualizá-
la para uma assinatura Pay-As-You-Go. O Azure Databricks requer oito núcleos
de recursos de computação. A assinatura de avaliação do Azure tem apenas
quatro núcleos de recursos de computação. Se você estiver usando uma
assinatura Enterprise ou MSDN Azure, ela deverá conter recursos suficientes para
o Azure Databricks.
Como fazer...
Tudo bem, vamos brincar com Delta Lake!
###Delta Lake
CopyExplain
3. Em outra célula, vamos criar um banco de dados chamado . Usamos a
linguagem SQL para isso, daí a primeira linha do código a seguir. ETLInAzure
%sql
%sql
SHOW DATABASES;
CopyExplain
4. A captura de tela a seguir mostra que o database foi criado:ETLInAzure
stateIncomeDF.write.format("delta").save("/mnt/tables/stateIncome")
CopyExplain
7. Adicione uma nova célula e cole o seguinte comando. Ele listará os arquivos
armazenados no disco quando salvamos o DataFrame:
8. #List all the files created
display(dbutils.fs.ls("/mnt/tables/stateIncome"))
CopyExplain
Você deve obter um resultado como o da captura de tela a seguir. Podemos
ver que existe um diretório chamado . Veremos mais adiante:_delta_log
'/mnt/tables/stateIncome'")
CopyExplain
14. Vamos agora ler a tabela. Em uma nova célula, digite o seguinte comando
SQL e execute-o:
15. %sql
FROM ETLInAzure.StateIncome
CopyExplain
summedTotalIncomeAmount
CopyExplain
22. Para ver se a linha foi inserida, vamos digitar e executar o seguinte código
Python em uma nova célula:
23. latestVersionDF = (spark .table("ETLInAzure.stateIncome")
24. .orderBy("abbr")
25. )
display(latestVersionDF)
CopyExplain
26. Um novo DataFrame é criado a partir da tabela e o exibimos ordenado pela
coluna abbr. A captura de tela a seguir mostra o conjunto de resultados.
Podemos ver que a linha ALL state code (abbr) é criada:
display(fullHistoryDF)
CopyExplain
33. O DataFrame contém todo o histórico, como mostrado na captura de tela de
following:fullHistoryDF
36. .format("delta")
37. .option("versionAsOf", 0)
38. .load("/mnt/tables/stateIncome").
39. orderBy("abbr")
40. )
display(tableCreatedDF)
CopyExplain
41. Para provar a diferença, usaremos um comando SQL. Para usar nosso em
SQL, precisamos usar a seguinte operação: . Adicione uma nova célula e
digite e execute o seguinte comando:tableCreatedDFcreateOrReplaceTempView
tableCreatedDF.createOrReplaceTempView("OriginalTable")
CopyExplain
42. Agora vamos testar a diferença entre os dois conjuntos, um com o e outro
sem. Em uma nova célula, digite e execute o seguinte comando SQL:ALLabbr
43. %sql
The result set shows that the only difference is the ALL abbr row as shown in
the following screenshot:
46. Now, let's see what we got in our directory. In a new cell, type and run the
following command:
47. #List all the files created
display(dbutils.fs.ls("/mnt/tables/stateIncome/_delta_log"))
CopyExplain
48. We can now see that we have two versions ( files). The first one, (), is
around bytes while the second one, (), is smaller: around bytes. Let's look at
the content of the second file. In a new cell, type and run the following
command:.json00000000000000000000.json2477200000000000000000001.json897.j
son
dbutils.fs.head('/mnt/tables/stateIncome/_delta_log/00000000000000000001.json')
CopyExplain
49. The result shows the file's content. By the end of the content, we see that we
have added one record () with the values , ,
and :numRecordsALLAllStates999999999
50. {\\"numRecords\\":1,\\"minValues\\":{\\"abbr\\":\\"ALL
51. \\",\\"stateName\\":\\"AllStates\\",\\"summedTotal
52. IncomeAmount\\":999999999},\\"maxValues\\":{\\"abbr\\
53. ":\\"ALL\\",\\"stateName\\":\\"AllStates\\",\\
54. "summedTotalIncomeAmount\\":999999999},\\"
55. nullCount\\":{\\"abbr\\":0,\\"stateName\\":0,\\
"summedTotalIncomeAmount\\":0}}"}
CopyExplain
That's it! We have successfully used the Delta Lake engine to create a table out of
our URLs!
How it works…
In this recipe, we created a database using Delta Engine. We then saved
our DataFrame as a table in it. We inserted a supplemental line by creating an
artificial state code. We then used the Delta Lake Time Travel functionality to
query the before and after insertion of the state row. We were also able to see the
changes in the log folder of the Delta table.StateIncomeDFALLALL
There's more…
Delta Lake também está disponível como uma oferta totalmente de código aberto.
Podemos usá-lo sem usar um espaço de trabalho Databricks. A versão mais
recente está disponível para download em https://delta.io/. Podemos usá-lo com
uma instalação local do Spark em nossa máquina. O link a seguir mostra como
começar a usá-lo: https://docs.delta.io/latest/quick-start.html. O seguinte site
mostra como fazer isso em um PC com Windows
10: https://kontext.tech/column/spark/311/apache-spark-243-installation-on-
windows-10-using-windows-subsystem-for-linux.
Escrevendo no SQL Server do Azure
Até agora, lemos dados da internet e os armazenamos em uma tabela Delta Lake.
As tabelas Delta são boas como uma camada de consumo, mas têm algumas
ressalvas:
Nesta receita, vamos salvar nossa tabela criada na receita anterior, Usando Delta
Lake. Certifique-se de tê-lo criado antes de fazer esta receita. Também estamos
usando o banco de dados SQL do Azure. Nós o criamos no Capítulo
2, Apresentando o ETL.ETLInAzure.StateIncomeAdventureWorks
Preparando-se
Se você estiver usando uma assinatura de avaliação do Azure, precisará atualizá-
la para uma assinatura Pay-As-You-Go. O Azure Databricks requer oito núcleos
de recursos de computação. A assinatura de avaliação do Azure tem apenas
quatro núcleos de recursos de computação. Se você estiver usando uma
assinatura Enterprise ou MSDN Azure, ela deverá conter recursos suficientes para
o Azure Databricks.
Como fazer...
Agora estamos prontos para gravar dados em nosso servidor SQL do Azure!
10. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
SQL Server")
jdbcUrl = "jdbc:sqlserver://{0}:
jdbcUserName, jdbcDBPassword)
CopyExplain
22. Agora, vamos recuperar nossa tabela Delta em um DataFrame. Em uma nova
célula, digite e execute o seguinte comando:ETLInAzure.StateIncome
23. # Load the ETLInAzure.StateIncome table in a dataframe
display(stateIncomeJDBCDF)
CopyExplain
25. No Capítulo 6, Azure Data Factory, criamos uma tabela chamada com a
seguinte estrutura. Se você não o criou, faça-o agora como precisaremos dele
nesta receita:SalesLT.IncomePerStates
26. CREATE Table SalesLT.IncomesPerState(
)
CopyExplain
31. A tabela de destino tem um campo para todos os nossos campos da tabela
Delta: , e . Só nos falta. Esta coluna é útil para saber qual ID de processo
carregou os dados. No SSIS, usaríamos . No Capítulo 6, Azure Data Factory,
usamos o . Nesta receita, usaremos o ID de execução do bloco de anotações.
Insira e execute o código a seguir em uma nova célula. delta table abbr >
SQL Server StateAbbreviationdelta table stateName > SQL Server
StateNamedelta table summedTotalIncomeAmount > SQL Server
StateIncomeBatchIDServerExecutionIDpipelineRunID
notebook_info =
json.loads(dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson())
runid = notebook_info["currentRunId"]
if runid is None:
print(runid)
CopyExplain
32. Agora, estamos prontos para adicionar uma nova coluna ao nosso
DataFrame. Adicione uma nova célula, digite e execute o código a seguir.
Usamos a função para adicionar uma coluna ao DataFrame usando uma
variável:stateIncomeJDBCDFlit
33. from pyspark.sql.functions import lit
36. .withColumnRenamed("abbr","StateAbbreviation")
37. .withColumnRenamed("stateName","StateName")
38. .withColumnRenamed("summedTotalIncomeAmount","StateIncome
39. ")
41. )
display(stateIncomeJDBCDF)
CopyExplain
44. .options(url=jdbcUrl,
45. dbtable="[SalesLT].[IncomesPerState]")
46. .mode("overwrite")
47. .save()
)
CopyExplain
48. A tabela agora é carregada no SQL Server. Para verificar, preenchemos um
novo DataFrame com o conteúdo do SQL Server. Digite e execute o seguinte
código em uma nova célula:
49. queryDF = "(SELECT StateAbbreviation, StateName, StateIncome, BatchID \
display(sqlServerDF)
CopyExplain
Há duas estratégias básicas para migrar pacotes do SSIS para o Azure: executá-
los como estão ou reescrevê-los. Exploraremos ambas as opções neste capítulo.
Ao final deste capítulo, você terá uma compreensão de como lidar com a migração
de pacotes SSIS para o Azure.
Executando pacotes SSIS no ADF
O Data Factory fornece uma maneira de executar pacotes SSIS: tempos de
execução de integração SSIS. Esta receita irá ensiná-lo a usá-lo. Esta receita
mostra as etapas para baixar o Assistente de Migração de
Dados (https://www.microsoft.com/en-us/download/details.aspx?
id=53595#:~:text=Data%20Migration%20Assistant%20%28DMA%29%20enables
%20you%20to%20upgrade,performance%20and%20reliability%20improvements
%20for%20your%20target%20environment). No momento em que este artigo foi
escrito, o Assistente de Migração de Dados não oferece suporte ao SSIS 2019.
Mesmo que pudéssemos usá-lo, é sempre bom saber como fazer essas etapas
manualmente.
Preparando-se
Essa receita pressupõe que você tenha uma assinatura válida do Azure e tenha
conhecimento do ADF (ADF). Ele também pressupõe que você leu e concluiu as
receitas do Capítulo 4, Integração de Dados do Azure, pois usaremos os pacotes
desenvolvidos nesse capítulo.
Como fazer...
Vamos mergulhar em nossa jornada de migração SSIS!
12. Once the folder is created, we can see it created as well as two subfolders, as
shown in the following screenshot:
13. It's now time to deploy the SSIS project we created in Chapter 4, Azure Data
Integration. Start Visual Studio and select the project. In Solution Explorer,
right-click on the project and select Deploy.Chapter 4
14. On the Select Deployment Target page, we have two options. Since we
already created our SSIS integration runtime, we can either choose SSIS in
SQL Server or SSIS in ADF. The latter allows you to create a factory and
an Azure-SSIS integration runtime on the go. The only issue with it is that you
cannot specify a specific resource group/factory combination. SSIS creates
random resource groups and factories for you. Since we know what data
factory to use and we've created an Azure SSIS integration runtime, we will
use the first option. Click Next:
Figure 8.11 – Deploy an SSIS project
16. Review the summary and click on Deploy to deploy the project to the SSIS
catalog on Azure SQL Server.
17. Once deployed, go back to SSMS. Refresh the Integration Services
Catalog nodes and expand it up to the package levels. You should see that
we have two packages deployed: HiveSSIS.dstx and PigSSIS.dtsx.
18. As shown in the following screenshot, right-click on the project and
select Configure… from the contextual menu that appears:
Next, make sure that there's an inbound rule in your Windows firewall that
allows SQL Server to be available to the outside world. In a production
scenario, we would join our Azure-SSIS integration runtime to the network by
specifying a VNet in the advanced settings at its creation. The following link
shows you how to use on-premises SQL Server with the ADF Azure-SSIS
integration runtime: https://docs.microsoft.com/en-us/azure/data-factory/ssis-
azure-connect-with-windows-auth#provide-domain-credentials-for-windows-
authentication.
22. Now, let's execute our packages from Azure SQL Server. We will try it from
there because our data factory will call the same execution. Testing it from
Azure SQL is faster, and we will not have to wait for the ADF status to change
if a package execution fails. We're going to try the Hive package first. In
SSMS, right-click on the HiveSSIS.dtsx package and select Execute. Click
on OK to execute the package and open the execution report when asked.
23. The package fails to execute because the Azure-SSIS integration runtimes are
missing the Java JRE that allows us to use the parquet format. Let's leave it
like that for now and execute the package. Right-click on
the PigSSIS.dtsx package and execute it.PigSSIS
24. As shown in the following screenshot, the package executes successfully:
25. Now that we know that the package executes correctly, let's call it from our
data factory. Go back into it and add a new pipeline. Call it PipelineSSISPIG.
Add an Execute SSIS package activity to it and name it PIG. Set
the Settings tab's properties as shown in the following screenshot:PigSSIS
Figure 8.17 – Executing the SSIS PIG package
33. Now, we can run our pipeline. Click on Debug at the top of the pipeline. SSIS-
IR will be started and the PigSSIS package starts as shown in the following
screenshot. After the package execution has completed, SSIS-IR will be
stopped:
34. Now that we have made a few new objects, it's a good time to publish them.
Click on the Publish button at the top of the pipeline to deploy all our
changes.
We've just executed an SSIS package in the cloud!
How it works…
Running SSIS packages in Azure requires a data factory with an Azure-SSIS
integration runtime. This gives us an Integration Services catalog in an Azure
database and provides us with scalable VMs to execute our packages. Because
those VMs are scalable, we can use up to 10 nodes in parallel and they can have
432 GB of RAM. This gives us lots of flexibility when it comes to executing SSIS
packages in Azure. The costs can be mitigated by starting and stopping our Azure-
SSIS integration runtime only when needed, that is, when we must execute our
SSIS packages.
SSIS will still be around for a few years. There are numerous third parties that have
developed useful components over the past two decades that are not available in
Azure yet. Having the possibility to use SSIS in an Azure pipeline gives us more
flexibility when it comes to designing cloud ETL or Extract, Load, Transform
(ELT) solutions.
Refatore nosso pacote HDInsight Hive para usar recursos do ADF, como um
fluxo de dados de mapeamento.
Preparando-se
Esta receita pressupõe que você tenha uma assinatura válida do Azure e tenha
conhecimento do ADF. Ele também pressupõe que você leu e concluiu a receita
anterior neste capítulo, Executando pacotes SSIS no ADF, e que você também
criou o data factory no Capítulo 6, ADF.
Como fazer...
Vamos agora reescrever nosso pacote usando ADF!HiveSSIS
4. O SHIR agora é criado. Agora vamos instalar o software Windows que atuará
como um gateway entre o ADF e nossa rede local. Normalmente, usamos
uma VM do Windows que tem acesso ao nosso recurso local – no nosso
caso, o banco de dados. Ele pode ser local ou no Azure. No nosso caso,
estamos instalando o software SHIR na mesma máquina em que instalamos o
banco de dados local. Conforme mostrado na captura de tela a seguir,
estamos usando a Opção 1: Configuração expressa. A opção 2 seria
usada para baixar o software SHIR e instalá-lo em outra máquina. Clique no
link destacado para iniciar a configuração do SHIR no seu PC:
8. Agora usaremos esse SHIR para criar um serviço vinculado ao nosso banco
de dados local do SQL Server. Na guia Gerenciamento, clique em Serviços
Vinculados e, em seguida, em + Novo para criar um Novo serviço
vinculado.
9. Na folha Novo serviço vinculado, digite sql na caixa de texto de pesquisa e
selecione SQL Server, conforme mostrado na captura de tela a seguir. Clique
em Continuar:
Figura 8.32 – Serviço vinculado ao ADF SQL Server local
12. Agora adicionaremos um pipeline que copiará dados do SQL Server local
para nossa conta de armazenamento do Azure, transformará os dados e os
copiará de volta para os bancos de dados locais do SQL Server.
Basicamente, as mesmas etapas que usamos para o pacote, exceto que
temos menos etapas envolvidas, já que o ADF cuidará do recurso de
computação à medida que aproveitamos o fluxo de dados
de mapeamento para transformar os dados em vez do HDInsight, como feito
no pacote SSIS.HiveSSIS
13. Vá para a guia Pipeline e adicione um novo pipeline à fábrica. Nomeie-
o PipelineAggregateContonsoRetailDW. Arraste uma atividade de
cópia para ela e nomeie-a Copy_FactSalesData. Vá para a guia Origem e
clique em + Novo à direita da propriedade Conjunto de dados Origem para
criar um novo conjunto de dados. Conforme mostrado na captura de tela a
seguir, selecione SQL Server como o tipo de conjunto de dados. Clique
em Continuar:
Figura 8.35 – Seleção local do conjunto de dados do SQL Server do ADF
21. Vá para a guia Pia . Crie um novo conjunto de dados para copiar os dados de
origem para nossa conta de armazenamento. Nomeie-o FactSalesParquet e
use o serviço de link LNK_ETLInAzure que criamos no Capítulo 6, ADF. O
formato do arquivo é parquet. Certifique-se de definir o caminho conforme
mostrado na captura de tela a seguir:
39. A última etapa é copiar o arquivo parquet de volta para o dbo. Tabela
SalesAgg em nosso banco de dados local. Com o SSIS,
usamos ServerExecutionID para obter uma auditoria do processo que inseriu
os dados da tabela. Isso é muito útil para verificar o ID do processo e
descobrir quando ele foi executado. Para cargas do ADF, usaremos o ID de
execução do pipeline, que é uma coluna de cadeia de caracteres, portanto,
não pode ser inserido na coluna ServerExecutionID da tabela existente; seu
tipo de dados é . Adicionaremos uma nova coluna à tabela
chamada BatchID para essa finalidade. Abra o SSMS, conecte-se ao SQL
Server local e execute o seguinte comando SQL:BIGINT
ALTER TABLE [ContosoRetailDW].[dbo].[SalesAgg] ADD BatchID
NVARCHAR(100) NULL
CopyExplain
40. Agora de volta à fábrica. Copiamos dados de nosso banco de dados local, os
transformamos e armazenamos o resultado em nossa conta de
armazenamento. Agora é hora de copiar as informações de volta para a
tabela local do SQL Server. Adicione uma atividade Copiar ao pipeline.
Vincule-o ao fluxo de dados DFT_SalesAgg. Nomeie-
o Copy_dbo_SalesAgg.
41. Defina a guia Origem conforme mostrado na captura de tela a seguir.
Observe que adicionamos uma coluna para mapear para ServerExecutionID.
Se não adicionarmos a coluna, a cópia falhará. Para adicionar o valor
da coluna, precisamos marcar a caixa de seleção Editar:
45. Agora, execute o pipeline no modo de depuração. Ele deve ser executado em
poucos minutos, como mostrado na captura de tela a seguir:
49. ,[unitcost]
50. ,[unitprice]
51. ,[salesamount]
52. ,[salesquantity]
53. ,[calendarmonth]
54. ,[ServerExecutionID]
55. ,[BatchID]
FROM [ContosoRetailDW].[dbo].[SalesAgg]
CopyExplain
56. Obtemos um resultado semelhante ao da captura de tela a seguir no SSMS:
Como funciona...
Leva alguns minutos para executar o pipeline em comparação com o pacote SSIS.
Isso se deve ao fato de que a computação é otimizada no ADF em comparação
com se iniciássemos e parássemos um cluster HDInsight. Estamos usando um
ambiente de computação nativo com o ADF. Além disso, temos mais controle
sobre a saída produzida pelo fluxo de dados de mapeamento. Lembre-se de que o
cluster HDInsight criou vários arquivos de saída com nomes de sistema. Com o
ADF, temos controle sobre a nomeação do arquivo de saída. Isso ajuda muito a
manter e entender as tubulações, pois produz uma saída mais limpa.
A criação de perfil de dados pode nos ajudar a encontrar quais métricas podemos
derivar do conjunto de dados de origem e até que ponto precisamos alterar
(transform) os dados para atender às regras de negócios. Ele também pode nos
ajudar a encontrar inconsistências de dados antes de iniciar a fase de ETL e
derivar um modelo de dados válido com base no conjunto de dados de origem.
O fluxo do processo desde a ingestão de dados até o relatório pode ser descrito
com o seguinte diagrama:
Requisitos técnicos
As receitas neste capítulo exigem o Azure Databricks, portanto, um espaço de
trabalho Databricks e um cluster Databricks precisam ser criados. Consulte
o Capítulo 7, Azure Databricks, especificamente para as receitas Criando um
espaço de trabalho Databricks e Criando um cluster em nosso espaço de trabalho,
onde ele é abordado em detalhes.
Preparando-se
Esta receita usa o Azure Databricks. Se você estiver usando uma assinatura de
avaliação do Azure, precisará atualizá-la para uma assinatura Pay-As-You-Go. O
Azure Databricks requer oito núcleos de recursos de computação. A assinatura de
avaliação do Azure tem apenas quatro núcleos de recursos de computação. Se
você estiver usando uma assinatura Enterprise ou MSDN Azure, ela deverá conter
recursos suficientes para o Azure Databricks.
Inicie o cluster Databricks antes de iniciar a receita. O cluster precisa ser iniciado
para que o código seja executado.
Como fazer...
Vamos começar nossa primeira receita:
Escolha o nome do seu novo bloco de anotações; por exemplo. Deixe todas
as outras configurações como padrão. Se o cluster Databricks estiver sendo
iniciado, ele aparecerá já selecionado na lista suspensa Cluster. Clique
em Criar, conforme mostrado na captura de tela a seguir:DataProfiling
Figura 9.2 – Uma captura de tela mostrando a adição de um novo bloco de
anotações Databricks
urlStateData = dbutils.widgets.get('urlStateData')
CopyExplain
Figura 9.3 – Uma captura de tela mostrando a adição de uma nova célula de
bloco de anotações Databricks
7. Uma nova célula será adicionada ao bloco de anotações. Para criar um novo
DataFrame a partir do arquivo CSV hospedado no site externo usando a
biblioteca de pandas do Python, adicione o seguinte código à célula. Observe
que o código também contém uma chamada de função para visualizar os
dados:display
8. import pandas as pd
9. stateDataDF = (spark.createDataFrame(pd.read_csv(urlStateData)))
display(stateDataDF)
CopyExplain
11. Antes de podermos executar o código, precisamos garantir que nosso bloco
de anotações esteja conectado a um cluster em execução. No canto superior
esquerdo do bloco de anotações, verifique se um cluster em execução está
selecionado, conforme mostrado na captura de tela a seguir:
Figura 9.4 – Uma captura de tela mostrando que o bloco de anotações está
conectado a um cluster
12. Agora clique no botão Executar tudo no menu superior para executar ambas
as células e visualizar os dados no DataFrame. O resultado é mostrado na
seguinte captura de tela:
13. Adicione uma nova célula e adicione o seguinte código a ela para criar uma
exibição temporária para poder usar no SQL:StateDataDF
stateDataDF.createOrReplaceTempView("StateData")
CopyExplain
14. Adicione uma nova célula e escreva o seguinte código nela. Observe que é
um comando mágico que permite escrever código SQL na célula:%sql
15. %sql
16. SELECT 'COUNT DISTINCT' AS RowValue,
22. UNION
29. UNION
FROM StateData
CopyExplain
39. MAX(length(STATE))
43. MAX(length(ZIPCODE))
FROM StateData
CopyExplain
44. Executando a célula pressionando Ctrl + Enter ou clicando no ícone Executar
célula no canto superior direito da célula, você verá um resultado como o das
seguintes telas:
Figura 9.7 – Uma captura de tela mostrando o resultado da criação de perfil
de comprimento máximo
47. SELECT
AdjustedgrossIsIncomeNULL,
HeadofHouseholdReturnsIsNULL,
TotalIncomeAmountIsNull
FROM StateData
CopyExplain
53. Executando a célula pressionando Ctrl + Enter ou clicando no ícone Executar
célula no canto superior direito da célula, você deve obter um resultado como
o mostrado na captura de tela a seguir:
Preparando-se
Esta receita usa o Azure Databricks. Se você estiver usando uma assinatura de
avaliação do Azure, precisará atualizá-la para uma assinatura Pay-As-You-Go. O
Azure Databricks requer oito núcleos de recursos de computação. A assinatura de
avaliação do Azure tem apenas quatro núcleos de recursos de computação. Se
você estiver usando uma assinatura Enterprise ou MSDN Azure, ela deverá conter
recursos suficientes para o Azure Databricks.
Como fazer...
Agora vamos ver como podemos criar perfis de dados com as funções integradas
do Spark. Vamos adicionar o código para esta receita no mesmo caderno que
criamos na receita anterior:
6. Usar o comando SQL para obter o esquema básico nos permite baixar os
dados, se necessário. Clique no ícone de download na parte inferior do
conjunto de resultados para baixar o arquivo CSV, conforme mostrado na
captura de tela a seguir:
9. Agora vamos tentar uma maneira mais simples de obter conhecimento sobre
nossos dados com o PySpark. Adicione uma nova célula de comando
clicando no ícone + abaixo da última célula de comando. Na nova célula,
adicione o seguinte código para usar a funcionalidade PySpark:describe()
display(stateDataDF.describe())
CopyExplain
10. Selecione a célula de comando atual e pressione o atalho Shift + Enter para
executar o código na célula selecionada e ver os resultados, conforme
mostrado na captura de tela a seguir:
Como funciona...
Esta receita abrange as etapas necessárias para fazer a criação de perfil usando
as funções internas do Spark. Estamos construindo em cima da primeira receita,
então os dados do CSV já estão carregados no DataFrame. Três funções
diferentes foram usadas para obter rapidamente informações sobre dados:
funcionalidade SQL e a função PySpark.describeprintSchema()describe()
Preparando-se
Esta receita usa o Azure Databricks. Se você estiver usando uma assinatura de
avaliação do Azure, precisará atualizá-la para uma assinatura Pay-As-You-Go. O
Azure Databricks requer oito núcleos de recursos de computação. A assinatura de
avaliação do Azure tem apenas quatro núcleos de recursos de computação. Se
você estiver usando uma assinatura Enterprise ou MSDN Azure, ela deverá conter
recursos suficientes para o Azure Databricks. Ele também precisa que você seja o
administrador do cluster, pois instalaremos algumas bibliotecas nele para obter
nosso perfil de dados.
Como fazer...
Vamos continuar trabalhando com nosso notebook para aprender sobre os
benefícios do perfil de pandas. Antes de escrever qualquer código, precisaremos
importar a biblioteca de criação de perfil dos pandas para nosso cluster
Databricks:DataProfiling
import pandas_profiling
# Choose 5 columns
col("A02650")).toPandas()
Dê uma olhada na captura de tela a seguir para ver quanta informação útil foi
derivada para colunas numéricas por criação de perfil de pandas:
Figura 9.18 – Uma captura de tela mostrando detalhes de variáveis numéricas
de criação de perfil de pandas
18. spark.conf.set( "fs.azure.account.key."+storage_account_name+".blob.core.windows.net",
storage_account_access_key)
CopyExplain
Observe que você deve usar seu próprio nome de conta de armazenamento
no código, pois os nomes de conta de armazenamento devem ser exclusivos.
Você também deve se certificar de que está tudo em uma
linha.".blob.core.windows.net"
Certifique-se de que o caminho esteja todo em uma linha – não deve haver
quebras de linha nele. Além disso, o caminho deve ser um caminho para sua
conta de armazenamento e você já deve ter o contêiner criado.profiling
23. dbutils.fs.ls(
"wasbs://profiling@etlinazure.blob.core.windows.net"))
CopyExplain
24. Clique em Executar célula para executar o comando. Você verá na saída as
informações sobre o novo arquivo com o relatório de perfil que foi criado.
Você verá um resultado semelhante à seguinte captura de tela:
O relatório agora pode ser compartilhado e usado para entender melhor o conjunto
de dados de origem e ajudar na tomada de decisões sobre como as regras de
negócios podem ser aplicadas a ele.
Como funciona...
Esta receita usa o perfil de pandas para obter mais insights sobre os dados. Essa
receita é construída com base em receitas anteriores, portanto, os dados já estão
carregados no DataFrame.
Usar o perfil de pandas faz muito trabalho para nós. Ele vai além das funções
internas do Databricks e nos traz visualizações úteis que nos ajudam a ter uma
melhor visão da qualidade dos dados. O relatório pode ser carregado no
armazenamento de blob usando um comando como . O relatório pode ser
compartilhado com modeladores de dados e cientistas para ajudá-los a definir
várias análises com o conjunto de dados de origem. dbutils.fs.put(<output file
name and path, prof.to_html(), overwrite=True)
Por melhor que seja o perfil dos pandas, ele tem algumas limitações. Por exemplo,
ele exige que usemos , que não são dimensionados tanto quanto suas
contrapartes do Sparks quando analisamos vários atributos de conjunto de dados.
É por isso que limitamos a análise a apenas algumas colunas nesta receita; Usar
todas as colunas exigiria um cluster muito maior e levaria mais tempo para ser
executado. pandas DataFrames
Esta receita conclui nosso capítulo sobre criação de perfil de dados com
Databricks. Vamos reiterar por que precisamos prestar atenção ao perfil de dados.
Hoje em dia, temos ferramentas como o Databricks para vir em nosso socorro.
Com ele, não precisamos definir um esquema com antecedência; nós
simplesmente trazemos os dados para um DataFrame e vamos a partir daí. Além
disso, vale a pena mencionar que podemos analisar muito mais dados, já que as
contas de armazenamento do Azure podem armazenar uma quantidade quase
ilimitada de dados e os clusters Databricks podem ser dimensionados para fazer
computação em uma quantidade muito grande de dados também.
Além disso, o Biml pode gerar qualquer coisa com base em um determinado
padrão: T-SQL, texto, JSON, modelos tabulares, Azure Data Factory, scripts do
PowerShell e muito mais. A única diferença entre esses formatos quando se trata
de Biml é que algumas coisas são mais fáceis de gerar do que outras porque são
suportadas nativamente pelo Biml.
Quero apresentar o poder do Biml neste capítulo e mostrar através das receitas
como ele pode tornar a codificação mais divertida e eficiente.
Aqui está a lista de receitas que este capítulo abordará. Vamos começar com o
mais básico e avançar para receitas mais avançadas:
Pré-requisitos de instalação
Pré-requisitos de instalação
Para completar as receitas deste capítulo, primeiro precisamos instalar os
seguintes pré-requisitos.
Como fazer...
Instale o projeto SSIS de exemplo com o pacote SSIS que acompanha o banco de
dados de exemplo seguindo estas etapas:DailyETLMain.dtsxWideWorldImporters
1. Vá para o GitHub
em https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-
importers-v1.0 e baixe , que está localizado sob o cabeçalho do SQL Server
Integration Services. Daily.ETL.ispac
2. Abra o Visual Studio 2019 e clique em Criar um novo projeto e
selecione Assistente de importação de projeto do Integration Services.
No formulário Configurar seu novo projeto, especifique ETLInAzure como o
nome do projeto SSIS, escolha o local e clique em Criar.C:\Projects\
3. A tela Assistente para Importação de Projeto do Integration Services será
exibida. Basta clicar em Avançar.
4. Na tela Selecionar Origem, mantenha a opção Arquivo de implantação do
Project selecionada e clique em Procurar para selecionar o arquivo que foi
baixado do GitHub, conforme mostrado na captura de tela a
seguir:Daily.ETL.ispac
Como funciona...
Agora que o projeto SSIS é importado, podemos começar as principais receitas.
Nas receitas SSIS deste capítulo, aprenderemos como escrever código Biml que
pode gerar o pacote de exemplo do zero. Abordaremos essa tarefa de forma
incremental em receitas subsequentes, indo passo a passo dos conceitos mais
simples para uma solução completa.DailyETLMain.dtsx
Preparando-se
Abra o Visual Studio 2019 e abra o projeto ETLInAzure SSIS que foi criado na
seção Instalando pré-requisitos.
Como fazer...
Adicione um novo arquivo e, usando o poder dos objetos nativos do Biml, gere seu
código T-SQL:BimlScript
1. Para adicionar um novo arquivo à sua solução, clique com o botão direito do
mouse no nome do projeto SSIS e escolha Adicionar Novo Arquivo Biml,
conforme mostrado na captura de tela a seguir:BimlScript
Figura 10.3 – Uma captura de tela mostrando a adição do novo arquivo Biml
2. Abra o arquivo e adicione o seguinte código entre as tags Biml para configurar
uma conexão de banco de dados e obter os metadados do banco de dados
usando o método: Recipe1.bimlGetDatabaseSchema()
3. <# var sourceConnection = SchemaManager.CreateConnectionNode("Destination", @"Data
Source=ETLInAzureBook\MSSQL2019;Initial Catalog=WideWorldImportersDW;Provider=
<#}#>
CopyExplain
8. Clique em Salvar. No canto inferior direito do painel de visualização, clique
em Atualizar. Você deve ver o código T-SQL gerado no painel de
visualização, conforme mostrado na captura de tela a seguir:
Como funciona...
Nesta receita, aproveitamos a estrutura de banco de dados que o mecanismo Biml
adquiriu ao se conectar ao Microsoft SQL Server e a usamos para gerar uma
instrução T-SQL com base em nosso modelo de instrução select para cada tabela.
Vejamos de perto o que está acontecendo nesta receita. O script Biml se conecta
ao SQL Server especificado na cadeia de conexão, carrega o esquema de banco
de dados e, no loop sobre uma coleção de elementos de tabela, gera uma
instrução usando , onde o objeto é uma linha que representa a tabela
SQL.foreachSELECT<#=table.Schema#>.<#=table.Name#>table
Tem mais...
De maneira semelhante, você pode gerar instruções de exibição para cada tabela.
Você pode usar o método da classe Biml para produzir a lista de todos os nomes
de coluna da tabela. Também é possível gerar instruções DDL (Data Definition
Language) para cada objeto no banco de dados, como veremos na próxima
receita. Eu encorajaria você a jogar com métodos internos que estão disponíveis a
partir do objeto de esquema de banco de dados Biml ao vivo recuperado pela
função. Usando o painel de visualização e o bloco de expressão que mostra os
valores compilados das variáveis, você pode aprender muitas coisas e usá-las ao
criar sua solução. GetColumnList()TableNodedropcreateGetDatabaseSchema<#= #>
Preparando-se
Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Basta pensar em um nome para seu segundo arquivo BimlScript. Vamos ser
originais e chamá-lo.Recipe2.Biml
Como fazer...
Vamos adicionar um novo arquivo BimlScript para esta receita.
7. #>
8. <#=key.GetDropAndCreateDdl()#>
<#}}#>
CopyExplain
Como funciona...
Este exemplo simples apenas faz um loop através de uma coleção de elementos
e, em seguida, através de uma coleção de cada um e obtém a instrução e
desse .TableIndexesTableDROPCREATEIndex
Preparando-se
Há alguns passos que precisamos tomar antes de começar:
) ON [PRIMARY]
CopyExplain
12. Preencha a tabela com os metadados de cada tabela de destino. Vamos usar
apenas e nesta receita, mas outras colunas serão úteis para as nossas
próximas receitas. Abra a janela Nova consulta e execute a seguinte
instrução:TableConfigTableTypeTableNameCREATE TABLE
13. INSERT [dbo].[TableConfig] VALUES (N'Dimension', N'Dimension', N'City',
N'MigrateStagedCustomerData', 2),
N'MigrateStagedEmployeeData', 3)
CopyExplain
Esse script insere apenas as três primeiras linhas da tabela. Para obter o
script T-SQL completo, consulte o GitHub.
Como fazer...
Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Adicione um novo arquivo BimlScript à sua solução. Renomeie o novo arquivo
BimlScript para . Geraremos um quadro básico para um pacote mestre
SSIS:Recipe3.biml
#>
CopyExplain
6. Agora, no bloco de texto, crie um esqueleto para o pacote adicionando
primeiro um elemento de coleção e, em seguida, adicionando um elemento.
Adicione um atributo ao elemento e defina-o como . Dentro do elemento ,
precisamos definir um elemento de
coleção:PackagesPackageNamePackageRecipe3PackageTasks
7. <Packages>
8. <Package Name="Recipe3">
9. <Tasks>
11. </Package>
</Packages>
CopyExplain
12. Agora precisamos encher nosso pacote com uma coleção de contêineres –
um para cada tabela de destino. As informações sobre tabelas de destino são
armazenadas em nossa tabela de metadados. Buscaremos informações de
tabela de nosso banco de dados de metadados, faremos um loop por ele e
criaremos um para cada linha de dados. Vamos colocar um bloco de controle
que faz exatamente isso dentro do elemento de coleção. Adicione o seguinte
trecho de código entre as tags:SequenceSequence ContainerTasksTasks
13. <#
16. {
19. sqlDtAdp.Fill(dtTables);
20. }
22. #>
24. </Container>
<#}#>
CopyExplain
25. Terminamos! Tudo o que precisamos fazer agora é salvar nosso arquivo
BimlScript; clique com o botão direito do mouse no arquivo e escolha Gerar
pacotes SSIS, conforme mostrado na captura de tela a seguir:
Figura 10.6 – Uma captura de tela mostrando o item de menu Gerar pacotes SSIS
Isso gerará um novo pacote SSIS chamado com um conjunto de vazio , conforme
mostrado na captura de tela a seguir:Recipe3.dtsxSequence Containers
Figura 10.7 – Uma captura de tela mostrando o pacote SSIS gerado
O único objetivo desta receita é demonstrar como usar o Biml para gerar um
pacote SSIS simples com base em uma tabela de metadados. Este pacote não
fará nada, mas mostra o conceito de gerar tarefas SSIS com base em um padrão
e dados de configuração externos provenientes de uma tabela de metadados.
Como funciona...
Nesta receita, Biml faz um loop através de um conjunto de registros e gera
elementos para cada registro. Ele usa e valores de cada linha para gerar um nome
de contêiner de sequência. Neste exemplo, temos dois tipos de código – um é
escrito em XML e o outro em . Usando a combinação deles, podemos dizer ao
Biml quais elementos SSIS queremos ter em nosso pacote SSIS e como
queremos adicioná-los. Usamos loops aqui para repetir o elemento para cada
tabela que temos, e usando XML estamos dizendo que queremos adicionar um e
quais parâmetros queremos dar. Sequence ContainerTableNameTableTypeC#C#Sequence
ContainerSequence Container
Tem mais...
No pacote SSIS que foi gerado, todos eles são configurados para execução
paralela, portanto, quando o pacote for executado, todos serão executados em
paralelo. Se quisermos criar uma sequência e executá-las uma após a outra,
podemos definir a propriedade do pacote para fazer com que todas as tarefas
sejam executadas com sucesso, uma após a outra. Veja a captura de tela a
seguir, por exemplo:Sequence ContainersConstraintMode
Desde que o código não tenha erros, o IntelliSense está funcionando. Quando o
IntelliSense para de funcionar, é porque há um problema no código em algum
lugar e você precisa corrigi-lo.
Preparando-se
Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Como fazer...
Adicione um novo arquivo BimlScript à sua solução e renomeie-o para . Copie o
código de para o novo arquivo BimlScript porque ele será nosso ponto de
partida:Recipe4.bimlRecipe3.biml
1. Altere o nome do pacote no elemento para . Mova o código que preenche o
objeto com os metadados para a parte superior do arquivo, sob a inicialização
da cadeia de conexão. É melhor ter a maior parte do bloco de controle em
massa na parte superior do arquivo, em vez de espalhado por todos os
lugares, pois isso torna o arquivo mais legível. PackageRecipe4DataTable
Consulte a captura de tela a seguir para obter uma referência sobre como o
bloco de controle deve ficar depois que o código de inicialização é movido
para a parte superior do arquivo:DataTable
Source=.;Initial Catalog=WideWorldImporters;Provider=SQLNCLI11.1;
ConnectionString="Data Source=.;Initial
Catalog=WideWorldImportersDW;Provider=SQLNCLI11.1;
</Connections>
CopyExplain
IncludeInDebugDump="Include">0</Variable>
IncludeInDebugDump="Exclude"></Variable>
</Variables>
CopyExplain
ConstraintMode="LinearOnSuccess">
CopyExplain
16. Adicione o elemento de coleção ao para começar a adicionar tarefas dentro
do contêiner. Em seguida, dentro do elemento collection, o primeiro que
adicionaremos é uma Expression Task, que define uma variável de usuário
SSIS para o valor da tabela de destino, conforme mostrado no seguinte
trecho de código:TasksContainerTasksTask
<Expression Name="Set TableName to <#=drTable["TableName"]#>"
ResultSet="SingleRow">
19. <Results>
21. </Results>
22. <Parameters>
DataType="String" />
DataType="Date" />
25. </Parameters>
</ExecuteSQL>
CopyExplain
27. Vamos adicionar uma segunda Tarefa Executar SQL para truncar a tabela de
destino, conforme mostrado no seguinte trecho de código:
28. <ExecuteSQL Name="Truncate <#=drTable["StagingTableName"]#>"
ConnectionName="WWI_DW_Destination_DB">
Integration.<#=drTable["StagingTableName"]#>;</DirectInput>
</ExecuteSQL>
CopyExplain
Aqui, temos uma tarefa Executar SQL mais simples que usa uma conexão
com e executa uma instrução T-SQL de linha única em uma tabela. O nome
da tabela para a instrução SQL é fornecido em tempo de compilação a partir
do valor na coluna da tabela de
metadados.ConnectionNameWWI_DW_Destination_DBStagingTableName
30. Adicione a última tarefa Executar SQL ao arquivo BimlScript para esta receita.
Semelhante à primeira Tarefa Executar SQL, ela tem elementos e . Também
especificamos que o é . Adicione o seguinte trecho de código ao arquivo
BimlScript:ResultsParametersDirectInputResultSetSingleRow
31. <ExecuteSQL Name="Get Last <#=drTable["TableName"]#> ETL Cutoff Time"
ConnectionName="WWI_DW_Destination_DB" ResultSet="SingleRow">
32. <Results>
34. </Results>
35. <Parameters>
DataType="String" />
37. </Parameters>
39. Agora estamos prontos para gerar nosso pacote SSIS mais volumoso que
tem algumas unidades de trabalho reais. Vamos clicar com o botão direito do
mouse e escolher Gerar pacote SSIS. Isso gerará um novo pacote SSIS, .
Você pode abri-lo para ver o que conseguimos construir até agora. Eu movi
os lados para que eles se encaixassem melhor na tela porque Biml gerou o
pacote SSIS com todos os dispostos um abaixo do outro. Ele deve se parecer
com a seguinte captura de tela:Recipe4.bimlRecipe4.dtsxSequence
ContainersSequence Containers
Você pode até mesmo executar este pacote no modo de depuração para ver se
tudo está funcionando como deveria. Como este pacote ainda não está completo,
tudo o que realmente fazemos aqui é truncar tabelas de destino. O objetivo desta
receita era avançar um passo em direção ao uso do Biml para gerar
automaticamente um pacote SSIS de amostra do projeto Wide World
Importers .DailyETLMain.dtsx
Como funciona...
Passando por cada linha da tabela com os metadados, Biml cria uma com quatro
tarefas dentro – uma e três – para cada tabela. Como precisa ter uma conexão de
banco de dados, Biml espera um elemento. Geralmente é muito simples e tudo o
que ele tem é um nome de conexão e uma cadeia de conexão.Sequence
ContainerExpression TaskExecuteSQL TasksExecute TasksConnection
Destaquei cada lugar na captura de tela onde Biml coloca um valor da tabela de
metadados, como foi instruído a fazer:
Tem mais...
Quando o código Biml se tornar muito grande e você quiser usar a tela inteira para
vê-lo, clique em Ocultar visualização no lado direito para ocultar o painel de
visualização e ver o código totalmente na tela. Você sempre pode recuperar a
visualização clicando em Mostrar visualização. O painel de visualização mostra o
Biml compilado e pode ajudar muito ao depurar seu código.
Sempre que você faz alterações no código Biml e salva o arquivo, o painel de
visualização geralmente é atualizado e atualizado com os resultados recém-
compilados. Se isso não acontecer e você não vir A visualização está
atualizada no canto inferior direito, use o botão Atualizar para atualizar a
visualização.
O que queremos realizar nesta receita é fazer o oposto do que estávamos fazendo
em receitas anteriores e gerar código Biml a partir de um pacote SSIS existente.
Preparando-se
Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Como fazer...
Adicione um novo arquivo Biml à sua solução e renomeie-o para . Copie o código
de para o novo arquivo Biml porque ele será nosso ponto de
partida:Recipe5.bimlRecipe4.biml
ConnectionName="WWI_DW_Destination_DB">
CopyExplain
9. Salve o arquivo e clique com o botão direito do mouse nele. Escolha Gerar
pacotes SSIS.Recipe5.biml
10. Abra o gerado e execute no modo de depuração, apenas para ter certeza de
que está tudo OK.Recipe5.dtsx
Como funciona...
Nesta receita, usamos a ferramenta BimlExpress Import Packages para gerar uma
porção Biml que precisávamos para o nosso arquivo Biml. Às vezes, é mais rápido
usar a ferramenta Importar pacotes do que escrever Biml manualmente. Como o
objetivo do uso do Biml é eficiência e economia de tempo, acho essa ferramenta
extremamente útil!
Tem mais...
Digamos que queremos bimlizar um padrão de ETL que se aplique a várias
tabelas. Para fazer isso, podemos criar manualmente um pacote SSIS da maneira
que queremos que ele seja gerado e, em seguida, convertê-lo em Biml
usando Converter pacote SSIS em Biml. Em seguida, criamos uma configuração
de metadados com elementos que mudam de tabela para tabela, como nomes de
tabelas, colunas, chaves primárias ou índices. Em seguida, escrevemos pepitas
de código C# em torno do Biml XML que gera vários pacotes SSIS exatamente
como o pacote original, mas para todas as tabelas configuradas nos metadados.
Essa é uma meta-receita para soluções de ETL Biml-zing.
Ponta
Colunas de origem, informações de metadados são essenciais para Biml para ser
capaz de gerar uma tarefa de fluxo de dados corretamente, por isso devemos
ajudar Biml a obter essas informações.
Ponta
BEGIN
SELECT
END
CopyExplain
Preparando-se
Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Como fazer...
Adicione um novo arquivo Biml à sua solução e renomeie-o para:Recipe6.biml
6. {
7. public static string GetDataType(string strDataType, string CharLength, string
8. {
string.IsNullOrEmpty(NumPrecision))
21. }
}
CopyExplain
A classe e o método têm que ser estáticos porque não precisamos instanciar
objetos; é apenas uma função de utilidade que queremos
usar.BIMLHelperGetDataType()
22. Adicione uma referência ao novo arquivo no arquivo Biml. Para fazer isso,
adicione a seguinte diretiva logo abaixo do elemento de abertura, na linha 2
do arquivo:Code.csRecipe6.biml<Biml>
<#@ code file="Code.cs" #>
CopyExplain
Esta directiva deveria estar no topo do processo, ao lado das directivas, e
informa a Biml de que iremos fazer referência no nosso bloco de controlo.
Isso permitirá a chamada do método definido no arquivo, diretamente do
arquivo Biml.importCode.csCode.cs
TABLE_NAME = '{0}' AND NOT (DATA_TYPE = 'int' AND COLUMN_NAME LIKE '%
29. BEGIN
30. SELECT
31. ";
33. {
35. sqlConnDest.Open();
36. SqlDataReader reader = command.ExecuteReader();
BIMLHelper.GetDataType(reader["DATA_TYPE"].ToString(),reader["CHARACTER_MAXI
MUM_LENGTH"].ToString(),reader["NUMERIC_PRECISION"].ToString(),reader["NUMER
reader["COLUMN_NAME"] + @"],"; }
40. }
41. reader.Close();
}
CopyExplain
Após esse código, o bloco de controle deve ser fechado pela tag de
fechamento, . #>
43. Agora vamos começar a escrever nosso bloco de texto, que conterá código T-
SQL. Coloque este código logo abaixo do bloco de controle:
44. DECLARE @sp NVARCHAR(MAX)
50. <#=strInject#>
51. '
[<#=drTable["GetStoredProc"]#>]'))
53. SET @sp = REPLACE(@sp,' PROCEDURE ', ' OR ALTER PROCEDURE ')
GO
CopyExplain
Esse é o shell da instrução T-SQL que será repetido para cada procedimento
armazenado. O núcleo da instrução provém da variável elaborada no bloco de
controle, como foi explicado na etapa anterior.strInject
57. Agora, a última coisa a fazer é adicionar uma tag de fechamento para o
loop:foreach
<#}#>
CopyExplain
Como funciona...
Neste exemplo, estamos fazendo um importante trabalho de preparação no banco
de dados de origem. Estamos fazendo uma alteração em cada procedimento
armazenado que recupera o conjunto de dados de origem para cada um no pacote
SSIS.WideWorldImportersData Flow TaskDailyETLMain.dtsx
No loop externo, inicializamos uma variável para armazenar uma instrução T-SQL.
Essa instrução é importante porque mostra ao Biml como serão as colunas de
saída quando o procedimento armazenado for chamado. O loop interno é
responsável por produzir uma instrução T-SQL como
esta: foreachstrInjectSELECTSELECTwhile
Para ajudar na produção de uma boa instrução T-SQL para um tipo de dados,
chamamos um método estático, , que foi preparado na Etapa 4 e adicionado em
um arquivo auxiliar, . Ele converte informações de metadados do SQL Server para
uma coluna em uma expressão T-SQL do tipo de dados que corresponde a ela.
Para obter os metadados da coluna, nos conectamos ao banco de dados de
destino e obtivemos as informações da coluna do INFORMATION_SCHEMA.
Visualização do sistema COLUNAS.GetDataType()C#Code.cs
O loop externo agrupa todas as colunas de uma tabela em uma instrução como
esta:foreachSELECT
SELECT
Ele o coloca dentro de uma instrução condicional que nunca deve ser executada:
IF 1 = 0
BEGIN
END
CopyExplain
Na última etapa, construímos uma instrução T-SQL que toma uma definição do
procedimento armazenado existente e adiciona a ela a instrução condicional
preparada acima. Essa instrução condicional é adicionada no início do
procedimento armazenado e não afeta a lógica do procedimento armazenado de
forma alguma.ALTER DDL
Tem mais...
Antes de prosseguir para um pacote SSIS complexo, gostaria de mencionar aqui
mais um truque que uso com bastante frequência em pepitas de código C#, e é
Language Integrated Query (LINQ). LINQ é uma sintaxe de consulta e permite
que você use consultas semelhantes a SQL em C#. Portanto, se você precisar
unir um conjunto de dados de metadados Biml retornado com conjuntos de dados
de metadados personalizados do banco de dados, poderá fazê-lo usando o LINQ.
Esta é uma sintaxe muito útil e poderosa e eu recomendo fortemente se
familiarizar com ela se você quiser implementar lógica complexa em seu
Biml.GetDatabaseSchema()BIMLmetadata
Source=.;Initial Catalog=WideWorldImportersDW;Provider=SQLNCLI11.1;Integrated
Security=SSPI;Auto Translate=False;");
sqlDtAdp.Fill(dtTables);
}
sqltables["StagingTableName"].ToString()}
StagingTableName = sqltables["StagingTableName"] };
CopyExplain
Preparando-se
Esta é a nossa última receita para pacotes SSIS, e é a mais complexa, então
vamos apertar o cinto e nos preparar para um passeio acidentado! Abra o Visual
Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
Como fazer...
Vamos adicionar um novo arquivo Biml para iniciar nossa receita:
1. Adicione um novo arquivo Biml à sua solução. Renomeie-o para . Copie todo
o código de dentro do , porque nesta receita vamos continuar a desenvolver
sobre o que foi feito na receita Gerando um pacote SSIS com Executar
tarefas SQL. Recipe7.bimlRecipe5.bimlRecipe7.biml
2. Altere o nome do pacote no elemento para .<Package>Recipe7
3. Como em Utilizar a receita Converter pacote SSIS em Biml, adicione uma
nova cadeia de conexão para o banco de dados de destino. Adicione o
seguinte trecho de código na linha que inicializa a cadeia de conexão para o
banco de dados: WideWorldImportersDWBIMLmetadata
string connStrDest = @"Data Source=ETLInAzureBook\MSSQL2019;Persist Security
5. Localize a linha que contém uma instrução; ele deve estar logo acima do
elemento de abertura. Adicione o seguinte código ao bloco de controle, logo
abaixo da instrução:foreach<Container>foreach
6. string strColumnSQL = string.Format(@"SELECT * FROM
TABLE_NAME = '{0}' AND NOT (DATA_TYPE = 'int' AND COLUMN_NAME LIKE '%
drTable["StagingTableName"]);
7. string strResultSet = @"WITH RESULT SETS ( (";
10. sqlConnDest.Open();
BIMLHelper.GetDataType(reader["DATA_TYPE"].ToString(),reader["CHARACTER_MAXI
MUM_LENGTH"].ToString(),reader["NUMERIC_PRECISION"].ToString(),reader["NUMER
IC_SCALE"].ToString(),reader["DATETIME_PRECISION"].ToString()) + @","; } }
15. reader.Close();
Após esse código, o bloco de controle deve ser fechado pela tag de
fechamento, . #>
16. Adicione o seguinte código Biml para a primeira parte da Tarefa de Fluxo de
Dados abaixo da última Tarefa Executar SQL, Obter Última Hora de Corte
de ETL <Tabela>:
17. <Dataflow Name="Extract Updated <#=drTable["TableName"]#> Data to Staging">
18. <Transformations>
ConnectionName = "WWI_Source_DB">
20. <Parameters>
VariableName="User.LastETLCutoffTime" />
22. <Parameter Name="@NewCutoff:Input"
VariableName="User.TargetETLCutoffTime" />
23. </Parameters>
drTable["GetStoredProc"].ToString().Equals("GetStockHoldingUpdates")){#>?, ?<#}#>
25. <#=strResultSet#>
26. </DirectInput>
</OleDbSource>
CopyExplain
ConnectionName="WWI_DW_Destination_DB" TableLock="false">
[<#=drTable["StagingTableName"]#>]" />
30. </OleDbDestination>
31. </Transformations>
</Dataflow>
CopyExplain
ConnectionName="WWI_DW_Destination_DB">
</ExecuteSQL>
CopyExplain
35. Salve o arquivo e clique com o botão direito do mouse nele. Escolha Gerar
pacotes SSIS. Desmarque o gerenciador de conexões da lista de itens na
caixa de diálogo Confirmar itens substituídos e clique
em Confirmar.Recipe7.biml
36. Abra o gerado e execute-o no modo de depuração. Compare com a
embalagem original. Ambos os pacotes devem ser
idênticos.Recipe7.dtsxDailyETLMain.dtsx
Como funciona...
Esta receita conclui nossa tarefa de recriar um pacote SSIS para uma solução de
exemplo usando Biml e uma tabela de configuração de metadados. Nesta receita,
adicionamos a Tarefa de Fluxo de Dados a cada pacote SSIS. No pacote SSIS
original fornecido para a demonstração, o SQL da Fonte de Fluxo de Dados está
chamando um procedimento armazenado que usa uma tabela temporária para
produzir um conjunto de dados de origem. O SSIS não pode lidar com conjuntos
de dados retornados por tabelas de dados temporários, porque ele não pode
entender a estrutura do conjunto de dados de retorno com antecedência, portanto,
temos que usar a expressão no SSIS e informar explicitamente quais metadados
são retornados pelo procedimento armazenado. Além disso, o próprio Biml não
está muito satisfeito com o uso das tabelas temporárias, então tivemos que
modificar cada procedimento armazenado e adicionar uma instrução que nunca
será executada, mas que preverá a estrutura do conjunto de dados de retorno
para Biml.WideWorldImportersSequence ContainerWideWorldImportersWITH RESULT
SETSELECT
Vamos dar uma olhada mais de perto na Etapa 5. O código demonstrado nessa
etapa contém lógica que recupera metadados de coluna do banco de dados de
destino para cada tabela. Em seguida, ele faz um loop pelas informações de tipo
de dados de cada coluna e constrói uma instrução que informa a Fonte de Tarefa
de Fluxo de Dados das colunas de saída, metadados. Usamos o método do
arquivo C# aqui novamente para nos ajudar a construir corretamente a
instrução. WITH RESULTS SETGetDataType()Code.csWITH RESULTS SET
Tendo feito todo o trabalho duro lidando com tabelas temporárias, o resto é fácil –
Biml para a Tarefa de Fluxo de Dados é lacônico e requer apenas as informações
essenciais, como nomes de Conexão de Origem e Destino, a instrução SQL de
Origem, o nome da tabela de Destino e uma opção de bloqueio de tabela de
Destino. Você não precisa se preocupar com o mapeamento de colunas, pois elas
são mapeadas automaticamente porque os nomes das colunas de origem e
destino correspondem exatamente. A Biml cuida de todo esse trabalho meticuloso
para você.
O que quero mostrar nesta receita é como gerar e implantar um Data Factory
simples no BimlStudio 2019. Essa fábrica de dados terá dois serviços vinculados,
dois conjuntos de dados e uma atividade de cópia que copia dados do conjunto de
dados Http de origem para o conjunto de dados coletor do Azure Data Lake
Storage Gen2. O serviço vinculado Http está apontando para uma fonte de dados
aberta, https://cadatacatalog.state.gov/. Também escreveremos um script do
PowerShell que implantará esse código do Data Factory no Azure.
Preparando-se
Baixe e instale uma versão de avaliação do Varigence BimlStudio 2019
do https://varigence.com/BimlStudio.
6. Entre com sua conta do Azure. Após a entrada bem-sucedida, você verá a
seguinte saída:
Como fazer...
O BimlStudio 2019 não oferece suporte a alguns componentes do Azure Data
Factory ou gera código JSON incorreto para eles, portanto, teremos que criar
um Serviço Vinculado para o Azure Data Lake Storage Gen2 manualmente no
Data Factory:
1. No navegador, vá para o portal do Azure e crie um grupo de recursos
chamado ETL. Crie um Azure Data Factory V2 vazio
chamado ETLInAzure no grupo de recursos ETL.
2. No ETLInAzure Data Factory vazio, vá para Conexões e, em seguida,
para Serviços Vinculados. Clique no botão + Novo no canto superior
esquerdo. Selecione Azure Data Lake Storage Gen2 e clique em Continuar.
3. Insira ETLInAzure para Nome e escolha Identidade
Gerenciada para Método de Autenticação. Selecione Inserir
manualmente no método de seleção Conta. No campo URL, insira
a URL do Azure Data Lake Storage Gen 2, conforme mostrado na captura
de tela a seguir. Essa criação de conta de armazenamento é abordada
no Capítulo 4, Integração de Dados do Azure:
Figura 10.25 – Uma captura de tela mostrando a criação do novo serviço
vinculado
8. Assim como no Visual Studio, você poderá ver a estrutura do projeto à direita.
Vá para a seção Azure Data Factory, clique com o botão direito do mouse e
selecione Adicionar Data Factory, conforme mostrado na captura de tela a
seguir:
Figura 10.27 – Uma captura de tela mostrando a adição de um novo Data
Factory
Clique com o botão direito do mouse no novo Data Factory e renomeie-o para
. Clique em Salvar tudo.ADFCloudETL
11. <LinkedServices>
Url="https://cadatacatalog.state.gov/"/>
Url="https://etlinazure.dfs.core.windows.net"/>
14. </LinkedServices>
15. <Datasets>
16. <HttpFile Name="DSHTTP" LinkedServiceName="LSHTTP"
RelativeUrl="/dataset/dbadcbe4-3d99-4225-b0e1-5f300f2ccb62/resource/94d1147b-03ad-431a-
98ba-71e0f6d8a879/download/geopoliticalregion.json" />
FolderPath="geo" File="geopoliticalregions.json"/>
18. </Datasets>
19. <Pipelines>
21. <Activities>
25. </Copy>
26. </Activities>
27. </Pipeline>
28. </Pipelines>
</DataFactory>
CopyExplain
Agora que os arquivos JSON são criados, precisamos encontrar uma maneira
de colocá-los no Azure. Podemos fazer isso manualmente criando Serviços
Vinculados, Conjuntos de Dados e um Pipeline manualmente e, em seguida,
copiando e colando código JSON em cada um, mas essa não é a maneira
mais eficiente de fazer isso. Portanto, na próxima etapa, usaremos o poder do
PowerShell para nos ajudar a implantar arquivos JSON no Azure mais
rapidamente.
31. Abra o ISE do Windows PowerShell e crie um novo arquivo, , com o seguinte
script:ADFCloudETLRecipe8.ps1
32. $resourceGroupName ="ETL"
ADFCloudETL"
LinkedServices\LSHTTP.json")
36. Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName
DSHTTP.json")
CopyExplain
39. Substitua o caminho de pelo valor correto para a pasta de saída. Execute o
PowerShell clicando no botão verde. Se a implantação for bem-sucedida,
você verá uma saída como a mostrada na captura de tela a seguir:
$rootPathRun Script
Figura 10.30 – Uma captura de tela mostrando a implantação do Data Factory
40. Vá para o portal do Azure para ver o resultado. Vá para o Data Factory. Você
deve ver dois serviços vinculados, conforme mostrado na captura de tela a
seguir: ADFCloudETL
Figure 10.31 – A screenshot showing the deployment of the Data Factory
You will also see a Pipeline and two datasets deployed to your Data Factory,
as shown in the following screenshot:
Upon successful execution, a new JSON file will appear in the storage
container .geo/geopoliticalregions.json
How it works…
BimlStudio 2019 generates all JSON files that are defining Data Factory concepts,
such as Linked Services, Datasets, Pipelines, Triggers, and Gateways. It
generates one file per component, and to facilitate the deployment of these files to
Azure Data Factory, we PowerShell script that deployed everything to Azure.
There's more…
Se você não puder usar o BimlStudio 2019, mas ainda quiser gerar dados do
Azure Data Factory com o Biml, poderá fazê-lo com a versão gratuita do
BimlExpress. Você será responsável, é claro, por gerar todo o código JSON para
cada componente, assim como fizemos com o T-SQL em receitas anteriores. É
um pouco mais trabalhoso, mas se seus objetos são muito repetitivos, é realista.
Preparando-se
Abra o SSMS e conecte-se a um banco de dados de configuração de metadados.
Execute o seguinte script para criar uma tabela de metadados para arquivos
CSV:BIMLmetadata
) ON [PRIMARY]
CopyExplain
VALUES
( 'KCLT.csv','Charlotte','NC'),
( 'KCQT.csv','LosAngeles','CA'),
( 'KHOU.csv','Houston','TX'),
( 'KIND.csv','Indianapolis','IN'),
( 'KJAX.csv','Jacksonville','FL'),
( 'KMDW.csv','Chicago','IL'),
( 'KNYC.csv','NewYork','NY'),
( 'KPHL.csv','Philiadelphia','PA'),
( 'KPHX.csv','Phoenix','AZ'),
( 'KSEA.csv','Seattle','WA')
CopyExplain
Agora vamos prosseguir com as etapas de preparação para o Data Factory.
Precisaremos fazer alguma configuração no Data Factory manualmente, porque o
BimlStudio 2019 não oferece suporte a alguns componentes do Data Factory ou
gera código JSON incorreto para eles. Primeiro, criaremos um Tempo de
Execução de Integração Auto-Hospedado chamado DWsOnPremises no Data
Factory. Ele deve ser hospedado no mesmo servidor usado para o SQL Server
que contém um banco de dados. Você pode seguir as etapas no Capítulo
8, Estratégias de migração do SSIS, onde a criação do Self-Hosted Integration
Runtime é explicada em detalhes. Como resultado, um tempo de
execução DWsOnPremises deve estar ativo e em execução na seção Tempos
de execução de integração do Data Factory, conforme mostrado na captura de
tela a seguir:ADFCloudETLWideWorldImportersDW
Agora que concluímos nossos preparativos, vamos passar para a receita em si.
Como fazer...
Precisamos fazer uma etapa preliminar para preparar tabelas SQL de destino para
uso nesta receita. Como carregaremos um conjunto de arquivos CSV em um
conjunto de tabelas de destino correspondentes, devemos criar essas tabelas no
banco de dados de destino.
Como mencionei anteriormente, o BimlStudio 2019 não oferece suporte a alguns
dos componentes do Azure Data Factory ou gera código JSON incorreto para
eles, portanto, teremos que criar dois serviços vinculados manualmente no Data
Factory:
14. {
17. sqlDtAdp.Fill(dtTables);
18. }
#>
CopyExplain
19. In a text block below the control block write a T-SQL statement to create a
separate schema for the destination tables, as shown in the following code
snippet:
20. CREATE SCHEMA Data538
AUTHORIZATION dbo
CopyExplain
21. Add a control block with a statement that will loop through a list of CSV files
that was loaded into a object:foreachdtTables
22. <#
#>
CopyExplain
24. In a text block below, write a T-SQL statement for a destination table creation.
The following script will create a table for each CSV file. There is one CSV file
per city, so the destination tables are named after the city and will have three
default columns with default values of a city, weather station code name, and
a state name in addition to a standard set of columns that are coming from the
CSV files:
25. CREATE TABLE [Data538].[<#=drTable["CityName"].ToString()#>](
DEFAULT('<#=drTable["CSVName"].ToString().Replace(".csv","")#>'),
) ON [PRIMARY]
CopyExplain
42. Add a one-line control block to close the loop:foreach
<#}#>
CopyExplain
43. Now we will add a text block with T-SQL code that will produce a single view
that combines data from all the tables into a single dataset. We can use this
view to query weather data from a single place with the city and state name.
As you can see in the following code snippet, the text block is sprinkled with
small pieces of control blocks that contain a loop, and with Expression Blocks
that provide us with table names used in the statements:foreachUNIONs
44. CREATE VIEW [Data538].[weather] AS
45. <#
46. int I = 1;
48. #>
50. [Data538].[<#=drTable""CityNam""].ToString()#>]
51. <#
53. UNION
54. <#}
55. i++;
}#>
CopyExplain
56. Save the Biml file and update the preview by clicking the Update
Preview button. The code that will appear in the preview is T-SQL code that
should be copied and pasted into a New Query window of SSMS and
executed on the database.WideWorldImportersDW
66. {
69. sqlDtAdp.Fill(dtTables);
70. }
#>
CopyExplain
71. In the XML Biml block, find the existing collection element. From the previous
recipe, it should contain two linked services. Here, we need to add two more,
as shown in the following code snippet:<LinkedServices>
72. <SqlServer Name""WideWorldImportersD"" Username""BookAdmi"" Password""zz""
MSSQL2019;initial catalog=WideWorldImportersD"">
74. </SqlServer>
</HttpServer>
CopyExplain
76. In the Biml block, find the collection element. It already has two datasets from
the previous recipe. Add the following code snippet to add three more
datasets for each line in the CSV configuration table: <Datasets>
77. <#foreach(DataRow drTable in dtTables.Rows) {#>
LinkedServiceName""ETLInAzur"" File""<#=drTable""CityNam""]#>.cs""
FolderPath""weathe"">
81. </AzureDataLakeGen2>
82. <SqlServer LinkedServiceName""ADFCloudETL.WideWorldImportersD""
<#}#>
CopyExplain
It will loop through the table and add one HTTP dataset, one Azure Data Lake
Storage Gen 2 dataset, and one SQL Server dataset for each CSV
file.dbo.CSVConfig
83. Still in the Biml block, go to the collection element. Under the existing pipeline,
add a new pipeline: . There will be one activity per CSV file in this pipeline. In
a loop for every CSV file, a new activity will be added to the pipeline, as shown
in the following code snippet:<Pipelines>Copy Political
RegionsCopyUSWeatherforeachCopy
84. <Pipeline Name""CopyUSWeathe"" DependencyMode""Parallel"">
85. <Activities>
88. <HttpSource
90. <AzureDataLakeGen2Sink
92. </Copy>
93. <#}#>
94. </Activities>
</Pipeline>
CopyExplain
95. Under the pipeline, add another pipeline: . In this pipeline, there will be one
activity per CSV file. In a loop for every CSV file, a new activity will be added
to the pipeline:CopyUSWeatherCopyUSWeatherSQLforeachCopy
96. <Pipeline Name="CopyUSWeatherSQL"
97. DependencyMode="Parallel">
98. <Activities>
100. {#>
103. <AzureDataLakeGen2Source
105. <SqlServerSink
106. DatasetName="DSSQL<#=drTable["CityName"]#>"/>
107. </Copy>
108. <#}#>
109. </Activities>
111. The successful build should update the output directory and generate JSON
files in the corresponding directories.
Deploying all these files manually to the Data Factory one by one would be
very inefficient, so we should use Biml to generate a PowerShell script that will
take care of deployment.
112. On the right side, in Project View, expand the folders to get to
the addedBiml folder and right-click to add a new Biml file:
$rootPath = "C:\Users\BookAdmin\Documents\ADFCloudETL\output\DataFactories\
ADFCloudETL\"
CopyExplain
126. Below the previous snippet, add the following code snippet to generate the
PowerShell script:
127. Set-AzDataFactoryV2LinkedService -DataFactoryName $ADFName -ResourceGroupName
($rootPath+"LinkedServices\FileThirtyEightHTTP.json")
("$rootPath+"Datasets\DSHTTP<#=drTable["CityName"]#>.json") -Force
($rootPath+"Datasets\DSDL<#=drTable["CityName"]#>.json") -Force
($rootPath+"Datasets\DSSQL<#=drTable["CityName"]#>.json") -Force
132. <#}#>
CopyUSWeather.json") -Force
CopyUSWeatherSQL.json") -Force
</Biml>
CopyExplain
135. Save the file and expand the preview pane where the PowerShell script is
generated, as shown in the following screenshot:
136. Copy and paste the generated PowerShell script into a new file
– . ps1ADFCloudETLRecipe9.ps1
137. Open the Windows PowerShell ISE and open the file. Execute the
PowerShell script by clicking on the Run Script button. Since we use in our
PowerShell script, we do not have the prompt Are you sure you want to
overwrite? for every existing component.ps1-Force
138. Now go to the Azure portal to see the results. You should see something
like the following screenshot:
148. ) s
149. INNER JOIN [Data538].[weather] w ON s.[state] = w.[state] + ')' AND w.[date] = s.[Invoice
Date Key]
ORDER BY 1
CopyExplain
The report shows that sale numbers are highest when the weather is
comfortable for the customer – not too hot and not too cold. This report does
not consider many other important points, for example, the average
temperatures in a specific region. Our focus here is not data science, but on
showing how online data can be quickly integrated into our on-premises data
warehouse. The following chart is the visual representation of the report:
Figura 10.39 – Uma captura de tela mostrando os resultados do relatório
Como funciona...
Usamos o Biml para gerar instruções para cada tabela de destino. CREATE TABLE
Não podemos usar uma única tabela de destino aqui porque ela requer a adição
de colunas adicionais ao conjunto de dados para diferenciar entre arquivos de
dados, e isso não funciona com conjuntos de dados do Data Factory gerados
automaticamente. Além disso, o uso de um procedimento armazenado no coletor
SQL foi considerado, mas invocar um procedimento armazenado processa os
dados linha por linha em vez de usar uma operação em massa, portanto, essa
opção não é ideal para o processamento de dados.
Esta é a última receita deste capítulo, mas este tópico realmente merece muito
mais páginas dedicadas a ele. Se você começou neste caminho, a aventura que
espera por você é emocionante e satisfatória, porque a mentalidade que você
adquire e aprimora usando Biml será útil muito além de Biml e SSIS. Esta é a
mentalidade de ser eficaz e ter um olhar aguçado para padrões e abstração.
Veja também
Na conclusão desta última receita, gostaria de fornecer uma referência a um
excelente recurso para desenvolvedores Biml: o site de Catherine
Wilhelmsen, https://www.cathrinewilhelmsen.net/biml/, onde ela tem material de
treinamento que pode ajudá-lo a aprender Biml com zero experiência anterior,
incluindo melhores práticas e exemplos úteis.
Biml foi lançado pela Varigence, empresa fundada por Scott Currie, em 2009. Ele
está sendo constantemente melhorado e desenvolvido, e mais e mais material
está disponível on-line para desenvolvedores que usam Biml. Se você quer
aprender Biml com seu criador, Scott Currie, vá para http://www.bimlscript.com/.
Este site tem um monte de material de treinamento que ensina Biml do nível
iniciante ao avançado e tem muitos exemplos úteis.
Há muito mais recursos disponíveis on-line para Biml, mas os dois sites que
mencionei têm o material mais completo e fácil de entender que eu vi sobre este
tópico.