Você está na página 1de 513

refácio

Extrair, Transformar, Carregar (ETL) é um dos procedimentos mais comuns e


tediosos para mover e processar dados de um banco de dados para outro. Com a
ajuda deste livro, você poderá acelerar o processo projetando soluções de ETL
eficientes usando os serviços do Azure disponíveis para manipular e transformar
quaisquer dados para atender às suas necessidades.

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.

A quem se destina este livro


Este manual destina-se a arquitetos de data warehouse, desenvolvedores de ETL
ou qualquer outra pessoa que queira criar aplicativos ETL escalonáveis no Azure.
Aqueles que desejam estender seus aplicativos ETL locais existentes para usar
big data e uma variedade de serviços do Azure, ou outros interessados em migrar
soluções locais existentes para a plataforma de nuvem do Azure, também acharão
o livro útil. A familiaridade com os serviços do SQL Server é necessária para
aproveitar ao máximo este livro.
O que este livro aborda
O capítulo 1, Introdução ao Azure e ao SSIS 2019, descreve, passo a passo,
como configurar o SQL Server 2019 para implantar os recursos usados ao longo
do livro. Ele também aborda como configurar uma assinatura do Azure.

O Capítulo 2, Introdução ao ETL, explica por que o ETL é necessário, de onde


vem e as diferenças entre ETL e ELT.

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 4, Integração de Dados do Azure, fala sobre o Azure Feature Pack,


que permite que o SSIS integre dados do Azure do armazenamento de blob e
clusters HDInsight.

O Capítulo 5, Estendendo o SSIS com tarefas e transformações


personalizadas, fala sobre como estender e personalizar o conjunto de
ferramentas interno com tarefas de fluxo de controle desenvolvidas sob medida e
transformações de fluxo de dados.

O Capítulo 6, Azure Data Factory, fala sobre como usar o Azure Data Factory para
mover e transformar dados na nuvem.

O capítulo 7, Azure Databricks, fala sobre o uso do Azure Databricks para


transformar dados na nuvem.

O Capítulo 8, Estratégias de migração de nuvem do SSIS, fala sobre a expansão


de pacotes SSIS para o Azure.

O Capítulo 9, Definindo a criação de perfil de dados no Azure, contém várias


receitas que mostram como executar a criação de perfil de dados no
Azure Databricks.
O Capítulo 10, Gerenciar o SSIS e o Azure Data Factory com BIML, contém várias
receitas que demonstram como gerenciar o SSIS e o Azure Data Factory com
BIML usando metadados.

Para tirar o máximo proveito deste livro


É necessário conhecimento básico ou prático do SQL Server, SSIS e Azure, assim
como conhecimento básico de técnicas de ETL e bancos de dados do SQL Server
do Azure. Você também precisa de um computador pessoal executando o
Microsoft Windows 10.

Algumas das receitas deste livro de receitas contêm soluções parciais e


incompletas que você completará seguindo as instruções da receita. Se, por
algum motivo, você ficar preso e não conseguir concluir as tarefas com êxito, as
cópias completas das soluções estarão disponíveis na pasta Solução do capítulo
correspondente. Por favor, use esses arquivos como referência ao trabalhar nas
receitas; Eles estão lá para ajudá-lo, não para impedi-lo de aprender realizando o
trabalho sozinho.

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.

Baixar os arquivos de código de exemplo


Você pode baixar os arquivos de código de exemplo para este livro de sua conta
em www.packt.com. Se você comprou este livro em outro lugar, você pode
visitar www.packtpub.com/support e se registrar para ter os arquivos enviados por
e-mail diretamente para você.

Você pode baixar os arquivos de código seguindo estas etapas:

1. Faça login ou registre-se no www.packt.com.


2. Selecione a guia Suporte.
3. Clique em Downloads de código.
4. Digite o nome do livro na caixa Pesquisar e siga as instruções na tela.

Uma vez que o arquivo é baixado, certifique-se de descompactar ou extrair a


pasta usando a versão mais recente de:

1. WinRAR/7-Zip para Windows


2. Zipeg/iZip/UnRarX para Mac
3. 7-Zip/PeaZip para Linux

O pacote de código para o livro também está hospedado no GitHub


em https://github.com/PacktPublishing/ETL-with-Azure-Cookbook Caso haja uma
atualização no código, ele será atualizado no repositório existente do GitHub.

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!

Baixe as imagens coloridas


Nós também fornecemos um arquivo PDF que tem imagens coloridas das
capturas de tela / diagramas usados neste livro. Você pode baixá-lo
aqui: https://static.packt-cdn.com/downloads/9781800203310_ColorImages.pdf.

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

Um bloco de código é definido da seguinte maneira:

INSERT OVERWRITE TABLE ETLInAzure.SalesAgg

SELECT storename , zipcode , SUM(unitcost) AS unitcost, AVG(unitprice) AS unitprice,

SUM(salesamount) AS salesamount, SUM(salesquantity) AS salesquantity, CalendarMonth

FROM etlinazure.salesource

GROUP BY storename, zipcode, CalendarMonth;


CopyExplain

Qualquer entrada ou saída de linha de comando é gravada da seguinte maneira:

USE master;

GO

CREATE DATABASE Staging;

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

Dicas ou notas importantes

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.

Errata: Embora tenhamos tomado todos os cuidados para garantir a precisão do


nosso conteúdo, erros acontecem. Se você encontrou um erro neste livro,
ficaríamos gratos se você nos relatasse isso. Por favor,
visite www.packtpub.com/support/errata, selecionando seu livro, clicando no link
Formulário de Submissão de Errata e inserindo os detalhes.

Pirataria: Se você se deparar com cópias ilegais de nossos trabalhos de qualquer


forma na Internet, ficaríamos gratos se você nos fornecesse o endereço do local
ou o nome do site. Entre em contato conosco pelo copyright@packt.com com um
link para o material.

Se você está interessado em se tornar um autor: Se há um tópico em que você


tem experiência e você está interessado em escrever ou contribuir para um livro,
visite authors.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!

Para obter mais informações sobre a Packt, visite packt.com.

Capítulo 1: Introdução ao Azure e ao


SSIS 2019
Neste livro de receitas, abordaremos o desenvolvimento de Extrair, Transformar,
Carregar (ETL) com o Microsoft Azure. Começaremos com o Microsoft SQL
Server 2019 Integration Services (SSIS) e, em seguida, passaremos
gradualmente para os recursos de gerenciamento de dados no Azure. Ao longo
deste livro de receitas, usaremos exemplos práticos, que não apenas fornecerão
experiência genuína em primeira mão no desenvolvimento de SSIS, mas também
demonstrarão como projetar uma solução de ETL funcional ou um módulo que
possa ser incorporado a uma solução de ETL.

Vamos começar estabelecendo seu ambiente de desenvolvimento. Vamos orientá-


lo durante a instalação de uma nova instância do SQL Server, incluindo todos os
componentes necessários para o desenvolvimento de soluções SSIS locais e
baseadas em nuvem. Você também instalará as ferramentas usadas na
administração e manutenção de instâncias do SQL Server – no local ou na nuvem.
Você também instalará as ferramentas usadas no desenvolvimento, teste e
implantação de suas soluções SSIS. Você concluirá este capítulo criando uma
assinatura do Azure, que permitirá que seu ambiente de desenvolvimento local se
estenda para a nuvem.

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:

 Instalando o Microsoft SQL Server 2019 Integration Services

 Instalando o SQL Server Management Studio

 Instalando o SQL Server Data Tools

 Instalando o Azure Data Studio

 Criando uma assinatura do Azure

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

Você pode encontrar informações mais detalhadas sobre os requisitos de


hardware e software do SQL Server 2019 no artigo de documentação do
fornecedor online (documentos SQL) intitulado SQL Server 2019: Requisitos de
hardware e software,
em https://docs.microsoft.com/en-us/sql/sql-server/install/hardware-and-software-
requirements-for-installing-sql-server-ver15.

Falando em documentação online, sua estação de trabalho vai precisar de acesso


à internet – até mesmo para realizar as instalações.

Instalando o Microsoft SQL Server 2019


Integration Services
Você instalará uma nova instância do SQL Server em sua estação de trabalho; se
preferir, você também pode atualizar uma instância existente do SQL Server,
conforme observado na receita. A instalação incluirá todos os recursos
necessários para projetar soluções SSIS em geral, não apenas para executar o
trabalho apresentado neste livro.

O SDK (Software Development Kit) das Ferramentas de Cliente, um


componente opcional do SQL Server, deve ser instalado na estação de trabalho
usada no desenvolvimento do SSIS. Ele contém os assemblies gerenciados
do .NET com acesso em tempo de design ao tempo de execução do SSIS, sem o
qual o desenvolvimento do SSIS simplesmente não pode ocorrer.

A instalação do SDK de Conectividade do Cliente SQL, outro componente


opcional, é recomendada, embora não seja necessária. Ele contém recursos de
conectividade do SQL Server Native Client que talvez você precise no
desenvolvimento de aplicativos de banco de dados.

Observação importante

Nenhum dos SDKs mencionados precisaria ser instalado em um servidor usado


para hospedar dados, pois esse servidor normalmente não seria usado para o
desenvolvimento do SSIS.

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

A edição Developer do SQL Server 2019 é uma edição gratuita completa,


licenciada para uso como um banco de dados de desenvolvimento e teste em um
ambiente que não seja de produção.

Baixe a mídia de instalação do site ou use a mídia de instalação fornecida pelo


administrador em sua organização. Se você decidir usar a edição Developer do
SQL Server 2019, baixe o executável do site e salve-o na unidade local na
estação de trabalho que você usará para as receitas deste livro. Se você preferir
usar a edição de avaliação do SQL Server 2019, terá que se inscrever no site
fornecendo algumas de suas informações pessoais antes de poder acessar a
mídia de instalação.

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:

1. Localize a mídia de instalação e clique duas vezes no executável de


instalação (por exemplo, para o SQL Server 2019 Developer Edition) para
iniciar a instalação.SQL2019-SSEI-Dev.exe

Quando solicitado pelo sistema operacional, que perguntará se você deseja


permitir que o aplicativo faça alterações no seu dispositivo, conforme
mostrado na captura de tela a seguir, clique em Sim para continuar:

Figura 1.1 – A caixa de diálogo Controle de Conta de Usuário de instalação


do SQL Server

2. No início da instalação, você será perguntado se gostaria de usar as


configurações básicas, personalizá-las ou simplesmente baixar o restante da
mídia de instalação.

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.

3. Agora você precisa selecionar o local dos arquivos de instalação. Use a


pasta Padrão, a menos que você prefira usar um local alternativo.

Quando estiver pronto, clique em Instalar para continuar. Dependendo da


sua conexão com a internet, deve levar apenas alguns minutos para baixar e
extrair os arquivos.

4. Depois que os arquivos de instalação tiverem sido preparados, a janela


da Central de Instalação do SQL Server será aberta, conforme mostrado na
captura de tela a seguir:
Figura 1.2 – Centro de Instalação do SQL Server

Na página Instalação, selecione a opção Nova instalação autônoma do


SQL Server ou adicione recursos a uma instalação existente para iniciar
a instalação wizard.

5. Na página Chave do Produto, especifique sua edição gratuita


(Desenvolvedor ou Avaliação) ou forneça a chave do produto de uma edição
licenciada que você tem permissão para instalar.

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.

6. Especifique a edição apropriada, conforme mostrado na captura de tela a


seguir:

Figura 1.3 – Especificando a edição do SQL Server


Clique em Avançar para continuar.

7. Na página Termos de Licença, leia e aceite os termos de licença e clique


em Avançar para continuar.
8. Na página Microsoft Update, mostrada na captura de tela a seguir,
marque Usar o Microsoft Update para verificar se há atualizações para
incluir as atualizações mais recentes para o produto, a menos que você
prefira instalá-las mais tarde:

Figura 1.4 – Adicionando atualizações disponíveis à instalação

Clique em Avançar para continuar.

O programa de instalação agora deve executar algumas verificações do seu


sistema para verificar se a instalação pode continuar.

9. Na página Regras de Instalação, você verá os resultados da validação do


sistema.
Se houver erros, clique no link na coluna Status para acessar cada
mensagem de erro. Dependendo do erro, a instalação pode não prosseguir
até que você corrija a causa ou pode até ter que ser abortada e reiniciada
depois que o problema for resolvido.

Se houver avisos, a instalação deve permitir que você continue; no entanto,


você deve inspecionar as mensagens de aviso de qualquer maneira,
conforme mostrado na captura de tela a seguir, pois atividades adicionais
podem ser necessárias durante ou após a instalação para que a instância do
SQL Server ou um ou mais dos recursos compartilhados funcionem conforme
o esperado:

Figura 1.5 – Regras de instalação

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.

Você não precisa fazer nenhuma alteração no firewall da estação de trabalho


no momento.

Quando estiver pronto, clique em Avançar para continuar.

Se a instalação detectar uma instância existente do SQL Server, uma etapa


adicional será adicionada, mostrada na captura de tela a seguir, solicitando
que você crie uma nova instância do SQL Server ou adicione recursos a uma
instância existente:

Figura 1.6 – Tipo de instalação

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:

a) Serviços de Mecanismo de Banco de Dados

b) Serviço de Consulta PolyBase para Dados Externos

c) Conector Java para fontes de dados HDFS

d) Conectividade das ferramentas do cliente

e) Serviços de Integração

f) SDK de Ferramentas de Cliente

g) SDK de Conectividade do Cliente SQL

Você pode ver parte da seleção na seguinte captura de tela:


Figure 1.7 – SQL Server 2019 Feature Selection

When ready, click Next to continue.

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:

Figure 1.8 – SQL Server 2019 Instance Configuration

If possible, use the default instance, as the preceding screenshot shows;


however, if you decide on using a named instance instead, we recommend
that you use MSSQL2019 as its name. Throughout this book, we will refer to
this SQL Server instance either as localhost (the default instance)
or MSSQL2019 – in both cases, this will mean the same SQL Server instance.

When ready, click Next to continue.

12. On the PolyBase Configuration page, leave the default settings unchanged,


as shown in the following screenshot, and click Next to continue:
Figure 1.9 – PolyBase Configuration

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.

When ready, click Next to continue.

14. On the Server Configuration page, on the Service Accounts tab, change


the Startup Type setting of the SQL Server Agent feature to Automatic.

Leave all other settings on this tab unchanged, as displayed in the screenshot


that follows:
Figure 1.11 – SQL Server service accounts

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.

To change the collation, click Customize next to the Database Engine


Collation setting, and then in the Customize the SQL Server 2019 Database
Engine Collation dialog, select the Windows collation designator and sort
order option with the following settings:

a) Collation designator: Latin1_General_100

b) Accent-sensitive: Checked

c) Char/Varchar Storage Options: UTF-8

The recommended settings are shown in the following screenshot:


Figure 1.12 – Setting the default collation for the SQL Server instance

Click OK to confirm the settings.

Review the settings on the Collation tab; the full name of the collation should


be Latin1_General_100_CI_AS_SC_UTF8, as shown in the following
screenshot:
Figure 1.13 – The default SQL Server collation

When ready, click Next to continue.

16. On the Database Engine Configuration page, on the Server


Configuration tab, shown in the following screenshot, leave Windows
authentication mode selected for Authentication Mode:
Figure 1.14 – Database Engine Configuration

Add the account you are currently using to the SQL Server


administrators role by clicking the Add Current User button.

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 ready, click Next to continue.

17. On the Ready to Install page, review the installation options listed in Steps


5 through 16.

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.

Click Close to complete the installation.

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.

19. In the Windows Start menu, in the folder, locate SQL Server 2019


Configuration Manager and start it:Microsoft SQL Server 2019
Figure 1.16 – SQL Server Configuration Manager

In Configuration Manager, shown in the preceding screenshot, under SQL


Server Services, you should see that the SQL Server instance that you just
installed is running; however, both SQL Server PolyBase services will either
be Stopped or in the Change pending… state.

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.

20. Under SQL Server Network Configuration | Protocols for


MSSQLSERVER, shown in the following screenshot, right-click the
disabled TCP/IP protocol, and select Enable from the shortcut menu:

Figure 1.17 – Enabling the TCP/IP protocol

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:

Figure 1.18 – Restarting the SQL Server instance

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.

Close SQL Server 2019 Configuration Manager.

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.

Se você instalou uma edição de avaliação do produto, lembre-se de que a licença


expira 180 dias após a instalação.

Instalando o SQL Server Management


Studio
O SQL Server Management Studio (ou SSMS, para abreviar) é a principal
ferramenta usada na administração, manutenção e desenvolvimento do SQL
Server. Ele pode ser usado para administrar bancos de dados relacionais
hospedados no Mecanismo de Banco de Dados ou bancos de dados analíticos e
soluções hospedadas no Analysis Services. Ele pode ser usado para administrar
o catálogo do SQL Server Integration Services and Database (SSISDB), usado
para implantações de projeto do SSIS. Você pode até mesmo usá-lo para
administrar o serviço SSIS herdado, usado para implantações de pacotes SSIS
herdados.

Observação importante

Embora a maioria das atividades de desenvolvimento do SSIS ocorra


no SSDT (Ferramentas de dados do SQL Server), você ainda deve instalar o
SSMS na estação de trabalho. Seus recursos de programação complementam o
SSDT, enquanto seus recursos administrativos e de manutenção excedem em
muito os disponíveis no SSDT.

É claro que o SSMS oferece suporte a várias linguagens de programação e


padrões de gerenciamento de dados normalmente associados ao gerenciamento
de dados: Transact-SQL (T-SQL, para abreviar) para manipular dados em bancos
de dados relacionais, MDX (Multidimensional Expressions) e DMX (Data
Mining Extensions) para análise de dados e extração de conhecimento, e XML
for Analysis (XMLA) para administrar Bancos de dados do SQL Server Analysis
Services (SSAS). Você pode até mesmo usar o SSMS para criar e editar
documentos XML.

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.

O site de download também pode ser acessado na Central de Instalação do SQL


Server.

Ponta

É recomendável sempre usar a versão mais recente do SSMS, pois ela


normalmente contém as correções mais recentes de segurança, estabilidade e
experiência do usuário. Os recursos e capacidades mais recentes estão,
naturalmente, também disponíveis apenas na versão mais recente do SSMS.

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

Você começará essa receita instalando o SSMS e a concluirá baixando um banco


de dados de exemplo do GitHub e implantando-o na instância do SQL Server
instalada na receita anterior, Instalando o Microsoft SQL Server 2019 Integration
Services:

1. No artigo de documentos da Microsoft intitulado Baixar o SQL Server


Management Studio (SSMS), inspecione as informações mais recentes sobre
o download. Preste muita atenção a quaisquer avisos ou considerações que o
fornecedor possa ter fornecido.

Quando estiver pronto, clique no link Baixar HTML do SQL Server


Management Studio (SSMS) para iniciar o download.

2. Se for solicitado a salvar o executável na unidade, clique em Salvar, aguarde


a conclusão do download e clique em Executar para iniciar a instalação.

Se o download for realizado em segundo plano, use o Windows Explorer para


localizar o arquivo em sua pasta e iniciar a execução a partir daí – por
exemplo, executando o arquivo.downloadsSSMS-Setup-ENU.exe

3. Na primeira tela da caixa de diálogo de instalação, deixe o local padrão


inalterado e clique em Instalar para continuar.
4. A instalação deve ser concluída dentro de alguns minutos.

Se a instalação for interrompida por um erro, investigue a causa com base


nas informações fornecidas na caixa de diálogo de instalação. Caso contrário,
clique em Fechar para concluir a instalação.

5. No menu Iniciar do Windows, localize a pasta e, nela, o atalho do Microsoft


SQL Server Management Studio 18. Abra-o.Microsoft SQL Server Tools 18
6. Na caixa de diálogo Conectar ao Servidor, selecione a instância do SQL
Server criada na receita anterior, Instalando o Microsoft SQL Server 2019
Integration Services.
A instância agora deve ser exibida no Pesquisador de Objetos do SSMS.

7. Abra a Central de Instalação do SQL Server e, na página Recursos, localize


o link Site de Exemplos SQL. Siga o link para navegar até o site de Exemplos
do Microsoft SQL Server.

No navegador da Internet, role para baixo até a seção Repositório de


Exemplos do SQL Server e clique no link para a ampla página da Web do
amplo banco de dados daWide World Importers .

8. Na nova página, localize o arquivo e clique no link para iniciar o


download.WideWorldImporters-Full.bak

Dependendo da sua conexão com a internet, o download deve ser concluído


em poucos minutos.

9. No SSMS, no Pesquisador de Objetos, clique com o botão direito do mouse


no nó Bancos de Dados e selecione Restaurar banco de dados... no menu
de atalho, conforme mostrado na captura de tela a seguir:
Figura 1.19 – Restaurando um banco de dados do SQL Server

10. Na caixa de diálogo Restaurar Banco de Dados, na página Geral, selecione


Dispositivo como origem e abra a caixa de diálogo Selecionar dispositivos
de backup clicando no ícone de reticências à direita da caixa de
texto Dispositivo, conforme mostrado na captura de tela a seguir:
Figura 1.20 – Selecionando o dispositivo de backup

11. Na caixa de diálogo Selecionar dispositivos de backup, clique


em Adicionar para abrir a caixa de diálogo Localizar Arquivo de Backup e
navegue pelo sistema de arquivos à esquerda para localizar o arquivo que
você baixou na Etapa 8.

Selecione o arquivo e clique em OK para confirmar a seleção.

12. Na caixa de diálogo Selecionar dispositivos de backup, clique em OK para


confirmar a seleção.
13. Na caixa de diálogo Restaurar Banco de Dados, clique em OK novamente
para iniciar a operação de restauração.
Deve levar cerca de um minuto para restaurar o banco de dados de exemplo.

Quando a caixa de mensagem for aberta com a mensagem


'WideWorldImporters' restaurada com êxito, o banco de dados deverá
estar disponível na instância selecionada.

Se houver erros, inspecione as mensagens de erro, faça as correções


necessárias e repita o processo de acordo.

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.

15. No SSMS, abra uma nova janela de consulta, conecte-se ao banco de


dados mestre e use o seguinte comando T-SQL para inspecionar as
configurações da instância de conectividade do Hadoop:
16. EXEC sp_configure

     @configname = 'hadoop connectivity';


CopyExplain

No resultado da execução, observe a coluna; se seu valor for , altere-o para


executando os seguintes comandos T-SQL:run_value07

EXEC sp_configure

     @configname = 'hadoop connectivity',

     @configvalue = 7;

reconfigure;
CopyExplain

Ao ativar essa definição de configuração, você permite que sua instância do


SQL Server se conecte a locais remotos de armazenamento de Blobs do
Hadoop ou do Azure. Usando o valor de configuração do , você permite
conexões com todas as versões e ambas as edições do Hortonworks, bem
como com o armazenamento de Blobs do Azure.7

Ponta

Mais informações sobre essa configuração estão disponíveis na


documentação do fornecedor,
em https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/
polybase-connectivity-configuration-transact-sql. Você deve estar
familiarizado com a configuração e seus possíveis valores antes de usar o
recurso em um ambiente de produção.

17. Use o seguinte comando T-SQL para verificar se o serviço PolyBase está


habilitado na instância do SQL Server:
18. EXEC sp_configure

     @configname = 'polybase enabled';


CopyExplain

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

     @configname = 'polybase enabled',

     @configvalue = 1;

RECONFIGURE;
CopyExplain

Ponta

Mais informações sobre essa configuração e os serviços do PolyBase em


geral estão disponíveis na documentação do fornecedor,
em https://docs.microsoft.com/en-us/sql/relational-databases/polybase/
polybase-installation. Você deve estar familiarizado com a configuração e
seus possíveis estados antes de usar o recurso em um ambiente de
produção.
19. Se todos os comandos forem concluídos com êxito, feche o SSMS. Desta
vez, você não precisa salvar o script ou a solução.
20. Abra o SQL Server 2019 Configuration Manager e reinicie a
instância MSSQLSERVER, como fez na Etapa 20 da receita
anterior, Instalando o Microsoft SQL Server 2019 Integration Services.

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.

Depois que a instância for reiniciada, você poderá fechar o Gerenciador de


Configurações.

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.

Você concluiu a receita implantando um banco de dados de exemplo na instância


do SQL Server recém-instalada. Você usará esse banco de dados em outras
receitas deste livro de receitas e estará livre para usá-lo sempre que estiver
explorando o SQL Server e seus recursos.

Instalando o SQL Server Data Tools


SSDT é uma edição especializada do ambiente de desenvolvimento
integrado (IDE) do Microsoft Visual Studio. Ele pode ser usado para
desenvolver uma variedade de projetos relacionados ao SQL Server, como
bancos de dados relacionais e do Azure, modelos de dados do Analysis Services,
relatórios do Reporting Services ou projetos do Integration Services, para citar
apenas alguns.

No passado, o SSDT costumava ser uma ferramenta autônoma, exigindo apenas


um subconjunto de recursos do Visual Studio para ser instalado. No entanto, a
partir do Visual Studio 2019 (ou SQL Server 2019), o SSDT representa uma
extensão (ou melhor: um conjunto de extensões) do IDE principal do Visual Studio.

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:

Figura 1.21 – Instalador do Visual Studio

Quando estiver pronto, clique em Continuar.

A instalação agora baixa e extrai os arquivos, após o que a caixa de


diálogo Instalando — Comunidade do Visual Studio 2019 deve ser aberta.

4. Na página Cargas de trabalho, na seção Desktop & Mobile, marque .NET


desktop development e, na seção Other Toolsets (Outros conjuntos de
ferramentas), marque Armazenamento e processamento de dados:
Figura 1.22 – Os detalhes da instalação do Visual Studio 2019

Verifique a lista de itens na coluna da direita – os mesmos itens devem ser


listados como os mostrados na captura de tela.

5. Deixe a opção Instalar durante o download selecionada na caixa de


combinação ao lado do botão Instalar.

Quando estiver pronto, clique em Instalar para continuar.

A instalação deve levar alguns minutos, dependendo da sua conexão com a


Internet, após o que o Visual Studio irá recebê-lo com a tela de entrada.

6. Clique em Não agora, talvez mais tarde para ignorar o processo de entrada


por enquanto.
7. Na próxima caixa de diálogo, selecione as configurações de desenvolvimento
e o tema de cores e clique em Iniciar o Visual Studio.

Claro, você também pode alterar essas configurações no SSDT mais tarde.

8. Após alguns minutos, o Visual Studio 2019 deve abrir, com a caixa de


diálogo Abrir recente/Introdução.

No momento, você só precisa acessar o IDE do Visual Studio 2019 para


instalar extensões adicionais do SQL Server.

Clique em Continuar sem código.

9. O Visual Studio é aberto sem quaisquer soluções ou projetos carregados.

No menu Extensões, selecione o comando Gerenciar Extensões.

10. Na caixa de diálogo Gerenciar Extensões, no Online | Página do Visual


Studio Marketplace, use a caixa de texto de pesquisa localizada no canto
superior direito para pesquisar , conforme mostrado na captura de tela a
seguir:integration services
Figura 1.23 – As extensões do Visual Studio 2019

Na lista de resultados da pesquisa, localize Projetos do SQL Server


Integration Services e clique em Download.

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

Durante a instalação de uma extensão do Visual Studio, as alterações podem


ter que ser feitas em arquivos do Visual Studio, o que não pode ser feito se
esses arquivos estiverem abertos. Portanto, este é o momento perfeito
durante a instalação para fechar o Visual Studio. Se os arquivos estiverem
abertos, uma mensagem de erro poderá ser exibida, solicitando que você os
feche antes de poder continuar.

17. Volte para o instalador de extensões do Visual Studio e agora clique


em Instalar para continuar.
18. Se o sistema operacional solicitar que os Projetos do SQL Server Integration
Services façam alterações no dispositivo, clique em Sim para continuar. A
instalação deve ser concluída dentro de alguns minutos.
19. Na caixa de diálogo final, clique em Fechar para concluir a instalação.

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

Para continuar usando a edição Community do Visual Studio 2019 além do


período de avaliação de 30 dias, você terá que entrar com uma conta do Microsoft
Live. Você pode usar a mesma conta que usará posteriormente neste capítulo
para criar a assinatura do Azure.

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.

Instalando o Azure Data Studio


O Azure Data Studio (ADS) representa uma nova ferramenta de administração,
manutenção e desenvolvimento de banco de dados a ser usada com
plataformas de dados da Microsoft locais ou na nuvem. Ao contrário do SSMS,
não só o ADS pode ser instalado no Windows, mas também no macOS ou Linux.

O ADS oferece uma nova abordagem para o desenvolvimento com um editor T-


SQL visual e funcionalmente rico, IntelliSense e trechos de código. Ele integra
visualmente os resultados de execução com as consultas T-SQL que foram
executadas para gerá-los e permite exportar resultados de consulta em vários
formatos padrão.

O objetivo do ADS não é substituir completamente o SSMS como a principal


ferramenta de administração, manutenção e desenvolvimento de dados, mas sim
complementá-lo, especialmente como uma ferramenta multiplataforma.

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:

1. Na página da Web Baixar e instalar o Azure Data Studio, localize o


link Instalador do Usuário recomendado e siga-o para iniciar o download.
Quando solicitado, salve o arquivo na unidade local da estação de trabalho.

Dependendo da sua conexão com a internet, o download deve ser concluído


dentro de um minuto.

2. Quando solicitado pelo navegador, clique em Executar para iniciar a


instalação; caso contrário, use o Windows Explorer para navegar até sua
pasta e iniciar a instalação lá.downloads
3. Revise o contrato de licença e clique em Avançar para continuar.
4. Na página Selecionar Local de Destino, deixe a pasta padrão selecionada e
clique em Avançar para continuar.
5. Na página Selecionar Pasta do Menu Iniciar, deixe o nome da pasta padrão
e clique em Avançar para continuar.
6. Na página Selecionar Tarefas Adicionais, você pode marcar a opção Criar
um ícone da área de trabalho se quiser colocar o atalho do ADS na área de
trabalho. Você também pode verificar a opção Registrar o Azure Data
Studio como um editor para tipos de arquivo com suporte se quiser que
todos os arquivos normalmente associados ao SSMS sejam abertos no ADS
por padrão:
Figura 1.24 – Selecionando tarefas adicionais na configuração do ADS

Se você não estiver planejando substituir o SSMS pelo ADS no momento,


deixe as configurações padrão inalteradas, conforme mostrado na captura de
tela.

Quando estiver pronto, clique em Avançar para continuar.

7. Na página Pronto para Instalar, revise as opções de configuração. Quando


estiver pronto, clique em Avançar para iniciar a parte automatizada da
instalação. A instalação deve ser concluída dentro de alguns minutos.
8. Na página final, desmarque a opção Iniciar o Azure Data Studio e clique
em Concluir para fechar o instalador.

Você não precisa iniciar o ADS neste momento.

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

Determinados serviços pagos no Azure incorrem em custos enquanto estiverem


online, mesmo que não estejam sendo realmente usados. Isso será apontado em
cada receita que trata desses serviços, e as instruções sobre como desativar um
recurso ou removê-lo completamente serão fornecidas.
No entanto, ao usar o Azure, você assume total responsabilidade por todos os
custos envolvidos no uso dos serviços fornecidos nele.

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:

1. Na página inicial do aplicativo Portal do Azure, clique em Continuar no site


do Portal do Azure.
2. Na página Entrar, não entre com suas credenciais existentes do Microsoft
Azure, mas clique em Criar uma! para criar uma nova conta.

Na próxima tela, forneça um endereço de e-mail válido para a conta. Use o


endereço de uma conta de email existente à qual você tem acesso e não está
associada a uma assinatura existente do Azure.

Como alternativa, você pode usar um número de telefone em vez de um e-


mail. Se você preferir usar um número de telefone, clique em Usar um
número de telefone e o formulário permitirá que você o insira. Novamente,
use um número de telefone existente de um dispositivo inteligente ao qual
você tenha acesso e que não esteja associado atualmente a uma conta 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.

Um e-mail de confirmação automático será enviado para o endereço de e-


mail que você usou anteriormente, ou uma mensagem será enviada para o
seu telefone se você usou um número de telefone.

5. Copie o código que lhe foi enviado na mensagem da equipa da conta


Microsoft para a caixa de texto do formulário Verificar e-mail. Quando estiver
pronto, clique em Avançar para continuar.
6. Na próxima tela, você será obrigado a provar que é uma pessoa real,
inserindo os personagens que você reconhece na captura de tela.

Se os caracteres forem difíceis de ler, clique em Novo para uma nova


imagem ou clique em Áudio para que as imagens sejam lidas através do
dispositivo de áudio.

Quando tiver inserido os caracteres corretos, clique em Avançar para


continuar.

7. Depois que a conta for criada, a página da Web Bem-vindo ao Azure será


aberta, solicitando que você inicie o tour. Clique em Talvez mais tarde para
fechar a caixa de diálogo.

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.

Você pode fechar o navegador de internet. No entanto, se você não


quiserativar a versão de avaliação, continue na Etapa 8.

8. Para iniciar a avaliação gratuita, clique em Iniciar:


Figura 1.25 – Ativando a avaliação gratuita do Microsoft Azure

9. Siga as instruções na página da Web. Você terá que fornecer algumas de


suas informações pessoais, incluindo um endereço de e-mail e um número de
telefone válido.

Observação importante

Se o Azure não estiver disponível em sua região, entre em contato com a


Microsoft e eles poderão ajudá-lo ainda mais.

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.

Como parte da verificação de identidade, você também terá que fornecer


detalhes válidos do cartão de crédito.
Observação importante

As informações do cartão de crédito não serão usadas a menos que você


atualize sua assinatura gratuita para uma assinatura pré-paga.

Antes de concluir o procedimento de ativação, você também precisa ler e


aceitar o contrato de assinatura.

Observação importante

Recomendamos que você se familiarize com o contrato de assinatura, os


detalhes da oferta e a declaração de privacidade antes de continuar.

10. Quando estiver pronto, clique em Inscrever-se para ativar sua avaliação


gratuita do Azure.

A ativação deve ser concluída dentro de alguns minutos.

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

Um dos objetivos deste livro de receitas é introduzir o desenvolvimento do SSIS


na nuvem, usando mais do que apenas os recursos básicos do SQL Server ou do
Azure. Infelizmente, a assinatura gratuita do Azure não fornece acesso a recursos
mais avançados (como o Serviço de Kubernetes do Azure ou o Azure Databricks);
Portanto, para completar receitas específicas, você terá que atualizar sua conta.

Cada uma dessas receitas conterá um aviso especial e fornecerá as instruções


apropriadas sobre como proceder.

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.

Capítulo 2: Introdução ao ETL


Quando comecei no negócio de data warehousing, algo como 20 anos atrás, fui
convidado em uma entrevista para definir ETL. Estando na minha primeira
entrevista de emprego, eu não tinha ideia do que o entrevistador queria dizer com
ETL. Felizmente, o entrevistador meio que gostou de mim e me contratou de
qualquer maneira. Ele me disse que eu saberia tudo sobre ETL em breve. Estando
em empresas de data warehouse por muitos anos e, mais recentemente, como
engenheiro de dados, o ETL é o que me manteve ocupado a maior parte do tempo
desde então.

ETL significa Extrair, Transformar e Carregar. ETL é uma técnica de


movimentação de dados que tem sido usada em várias formas desde o início dos
primeiros data warehouses corporativos.

A Microsoft formalizou o conceito de ETL no final da década de 1990 com uma


ferramenta chamada DTS: Data Transformation Service. Essa ferramenta de ETL,
destinada a ajudar os administradores de banco de dados a carregar dados de e
para o SQL Server, usava SQL e ActiveX para mover e transformar dados locais.

A Microsoft trouxe sua ferramenta de ETL para a nuvem com a introdução


do Azure Data Factory (ADF). Em 2018, a Microsoft reformulou extensivamente o
ADF para criar o Azure Data Factory v2, o que permitiu que o usuário concluísse
muitas tarefas no ADF que anteriormente exigiam o uso de mais software.

Outra ferramenta de ETL do Azure comumente usada é o Databricks. Essa


ferramenta usa o Apache Spark como um serviço de computação, permitindo que
os desenvolvedores usem muitas linguagens para desenvolver suas
transformações: Python, Scala, R e SQL. Java também pode ser usado para
desenvolver componentes compartilhados para serem usados por muitos pipelines
de ETL.
Fazer ETL é uma etapa necessária para qualquer data warehouse ou projeto de
ciência de dados. Ele é usado em vários formulários e formas em TI para tarefas
como as seguintes:

 Armazenando procedimentos ou script usado em relatórios: os dados são


extraídos de uma fonte de dados primeiro e transformados toda vez que uma
coluna é criada; Um cálculo é feito para várias seções de relatórios.

 Ferramentas de BI como o Power BI: esse tipo de ferramenta tem um modelo


no qual podemos adicionar medidas ou colunas que preenchem alguns
atributos ausentes na fonte de dados.
 Data warehouse e projetos científicos: Toda vez que um programa ou script
limpa dados ou os transforma para fins de consumo específicos, estamos
fazendo ETL.

Nos próximos capítulos, exploraremos todas essas ferramentas e daremos acesso


a receitas que mostrarão como fazer ETL no Azure.

Neste capítulo, abordaremos as seguintes receitas:

 Criando um banco de dados do SQL Azure

 Conectando o SQL Server Management Studio

 Criando um pacote ETL simples

 Carregando dados antes de sua transformação

Criando um banco de dados do SQL


Azure
Para fazer ETL, precisamos ter uma fonte para consultar dados e um destino
(muitas vezes chamado de coletor) para obter os dados transformados. Nossa
primeira receita criará um banco de dados simples do SQL Azure que será usado
como fonte e coletor em todas as receitas deste capítulo.
Preparando-se
No Capítulo 1, Introdução ao Azure e ao SSIS 2019, você foi mostrado como
instalar o SQL Server local, o SQL Server Management Studio (SSMS) e o
Visual Studio 2019 com a extensão SSIS. Este capítulo mostrará como configurar
o SQL Server no Azure e as receitas usarão esta versão do SQL Server.

Como fazer...
Em um navegador, vá para o portal do Microsoft Azure usando a seguinte
URL: https://portal.azure.com/#home.

Na página principal do portal, criaremos um grupo de recursos para agrupar todos


os serviços do Azure. É muito mais fácil encontrá-los e gerenciá-los mais tarde.:

1. Na página principal do portal, clique no sinal + para criar um novo recurso,


conforme mostrado na telaa seguir:

Figura 2.1 – Criar um recurso no Azure

2. Na caixa de pesquisa, digite . Clique no resultado da pesquisa Grupo de


recursos que aparece, como na captura de tela a seguir:resource
Figura 2.2 – Escolha Grupo de recursos na lista de pesquisa

3. Na folha Grupo de recursos, clique em Criar para criar um novo grupo de


recursos, conforme mostrado na captura de tela a seguir:

Figura 2.3 – Criar um grupo de recursos após a seleção

4. Selecione a assinatura, dê um nome ao grupo de recursos e escolha a região,


conforme mostrado na captura de tela a seguir:
Figura 2.4 – Novas propriedades do grupo de recursos

A região selecionada aqui será o padrão para todos os recursos criados no


grupo de recursos no futuro. O ideal é escolher um local não muito distante de
onde mora. Sempre podemos substituir essa configuração em cada recurso
que criamos no futuro.

Clique em Revisar + criar no canto inferior esquerdo da lâmina para validar


as entradas que fizemos. Depois de validado, clique em Criar para criar o
grupo de recursos.

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

6. Na folha exibida, selecione Bancos de dados à esquerda e clique em Banco


de dados SQL, conforme mostrado na captura de tela a seguir:

Figura 2.6 – Selecionar Banco de Dados SQL

7. A folha Criar Banco de Dados SQL é aberta. Defina as propriedades


conforme mostrado na captura de tela a seguir:
Figura 2.7 – Propriedades do banco de dados

Vejamos as propriedades do banco de dados:

a) Assinatura: Sua assinatura.

b) Grupo de recursos: EtLInAzureCookBook ou o grupo de recursos criado


antes.

c) Nome do banco de dados: Vamos restaurar um banco de dados


de exemplo que será usado em receitas futuras. Vamos chamá-lo
de AdventureWorksLT.

d) Servidor: Clique em Criar novo abaixo da lista de combinados. A


folha Novo servidor é exibida:
Figura 2.8 – Novas propriedades do servidor

Vejamos as propriedades do servidor:

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

b) Login de administrador do servidor: ETLAdmin.

c) Senha: Crie uma senha.

d) Confirmar senha: Confirme a senha criada.

e) Local: selecione um local do Azure. Você deve usar a mesma região que o
grupo de recursos criado antes.

f) Clique em OK para criar o servidor.

g) De volta à folha de criação do banco de dados, defina a opção SQL elastic


pool como Não.
h) Computação + Armazenamento: Clique no link Configurar banco de
dados. Vamos selecionar a configuração básica por enquanto.

i) Na folha Configurar, clique no link Procurando básico, padrão,


premium?, conforme mostrado na captura de tela a seguir:

Figura 2.9 – Alterar a capacidade do servidor

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

 Defina o método de conectividade como ponto de extremidade público.


 Na seção Regras de firewall, defina Permitir que os serviços e recursos
do Azure acessem este servidor como Sim. Isso será necessário em
capítulos posteriores quando usarmos serviços do Azure, como o Azure Data
Factory.
 Além disso, defina Adicionar endereço IP do cliente atual como Sim. Isso
colocará o endereço IP do computador atual na lista de permissões e,
portanto, permitirá que você se conecte ao banco de dados usando o SQL
Server Management Studio (SSMS) e o SQL Server Integration
Services (SSIS).
  Clique em Configurações adicionais.
 A folha Configurações adicionais é exibida. Na configuração Usar dados
existentes, clique em Exemplo, conforme mostrado na captura de tela a
seguir:
Figura 2.11 – Configurações adicionais do servidor

 Clique em Revisar + criar e, em seguida, em Criar para criar o banco de


dados.
8. Agora, verificaremos se o banco de dados de exemplo foi criado
corretamente. Entre no grupo de recursos e clique no recurso
AdventureWorksLT (etlinazurecookbook/AdventureWorksLT). A folha do
banco de dados é aberta. Como mostrado na captura de tela a seguir, clique
em Editor de consultas (visualização):
Figura 2.12 – Editor de consultas de banco de dados

Digite o login e a senha. O editor de consultas é aberto. Expanda a


pasta Tabelas, clique com o botão direito do mouse em qualquer tabela e
clique em Selecionar 1000 Linhas Principais no submenu exibido, conforme
mostrado na captura de tela a seguir:
Figura 2.13 – Banco de dados selecionar as 1000 principais linhas

9. Clique no botão Executar para executar a consulta.

Vamos para a próxima seção!

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.

Conectando o SQL Management Studio


ao SQL do Azure
Esta receita mostrará como se conectar ao nosso banco de dados SQL do Azure a
partir do seu computador.

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:

1. Vamos nos conectar ao banco de dados do Azure que criamos na receita


anterior, Criando um banco de dados do SQL Azure. Faça logon em sua
assinatura do Azure e navegue até o grupo de
recursos ETLInAzureCookBook.
2. Clique no banco de dados SQL AdventureWorksLT para abrir sua folha.
Copie o nome do servidor encontrado no canto superior direito, conforme
mostrado na captura de tela a seguir:

Figura 2.14 – Obter o nome do servidor da assinatura do Azure

3. Usando o SSMS, faça logon no servidor usando o nome de usuário e a senha


que usamos na Etapa 7 da receita anterior: Criando um banco de dados do
SQL Azure. Uma vez conectado, o Pesquisador de Objetos mostra o banco
de dados e seus objetos relacionados. A expansão da pasta Tabelas lista
todas as tabelas, conforme mostrado na captura de tela a seguir:

Figura 2.15 – Pesquisador de Objetos do SQL SSMS do Azure

É isso! Nós nos conectamos ao nosso servidor SQL do Azure a partir de um


programa local.

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:

 Extraia dados da tabela AdventureWorksLT SalesLT.Customer.


 Transformar dados: concatenando todas as informações relacionadas ao
nome do cliente em uma única coluna chamada FullName.
 Carregue os dados em uma nova tabela
chamada SalesLT.CustomerFullName.

A tabela que criamos será usada na receita final deste capítulo, Carregando


dados antes de sua transformação, para explicar o ELT.

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:

1. Selecione Criar um novo projeto na tela principal.


2. Selecione Projeto do Integration Services na tela exibida, conforme
mostrado na captura de tela a seguir:
Figura 2.16 – Visual Studio – criando um novo projeto do Integration Services

3. Conforme mostrado na captura de tela a seguir, nomeie o projeto como


AdventureWorksETL e selecione uma pasta para ele. Clique em Criar para
concluir a criação do projeto:
Figura 2.17 – Configuração do projeto SSIS

4. O projeto é criado e aberto, juntamente com um pacote


chamado Package.dtsx. Clique com o botão direito do mouse na
seção Gerenciadores de Conexões na parte inferior do pacote e
selecione Nova Conexão OLE DB... conforme mostrado na captura de tela a
seguir:

Figura 2.18 – Adicionar uma nova conexão OLE DB


5. Clique em Novo.... Insira o nome do banco de dados,
selecione Autenticação do SQL Server e digite o nome de usuário e a
senha. Selecione AdventureWorksLT como o nome do banco de dados e
clique em OK, conforme mostrado na captura de tela a seguir:

Figura 2.19 – Nova configuração de conexão OLE DB

6. De volta à janela de configuração do gerenciador de conexões, clique


em OK para concluir a criação do gerenciador de conexões, conforme
mostrado na captura de tela a seguir:
Figura 2.20 – Nova conexão OLE DB

7. Clique na tecla de função F2 no teclado para renomear o gerenciador de


conexões
para cmgr_etlinazurecookbook.database.windows.net.AdventureWorksL
T.ETLAdmin. Nós simplesmente prefixamos o nome com cmgr_. Essa é uma
convenção de nomenclatura padrão no SSIS que permite padrões de criação
de pacotes.
8. Clique com o botão direito do mouse no gerenciador de conexões e
selecione Converter em conexão de projeto no menu contextual, conforme
mostrado na captura de tela a seguir:
Figura 2.21 – Converter em gerenciador de conexões de projeto

Ter um gerenciador de conexões de projeto torna a conexão disponível em


todos os pacotes que criamos a partir de agora. O gerenciador de conexões
simplesmente estará presente em todos os pacotes do projeto, então não
precisaremos adicionar uma nova conexão, repetindo as etapas anteriores,
toda vez que adicionarmos um novo pacote ao projeto.

9. Na caixa de ferramentas SSIS à esquerda, arraste e solte uma Tarefa de


Fluxo de Dados na superfície do pacote. Nomeie-
o DFT_SalesLT_CustomerFullName. Esta é uma convenção de
nomenclatura que indica que esse fluxo de dados está processando dados
para SalesLT.CustomerFullName.
10. Clique duas vezes na Tarefa de Fluxo de Dados e adicione uma fonte de
dados OleDB da seção Outras fontes da caixa de ferramentas SSIS.
Chame-o OLEDBSRC_SalesLT_Customer. Isso indica que a fonte que
estamos usando é uma fonte OLEDB e extrai dados da
tabela SalesLT.Customer.
11. Clique duas vezes no gerenciador de conexões OLEDB e defina-o para o que
criamos antes. Defina o modo de acesso a dados como Comando SQL. Em
seguida, digite a seguinte instrução SQL dentro da caixa de texto de
comando SQL:
12. SELECT [CustomerID]

13.       ,[NameStyle]

14.       ,[Title]

15.       ,[FirstName]

16.       ,[MiddleName]

17.       ,[LastName]

18.       ,[Suffix]

  FROM [SalesLT].[Customer]
CopyExplain

Click on Preview to ensure that the query works correctly. Click on OK to


close the OLE DB source component.

19. Arraste e solte uma transformação de Coluna Derivada no Fluxo de Dados e


anexe-a à fonte OLE DB criada anteriormente. Renomeie-o DER_FullName,
indicando que isso está adicionando uma nova coluna chamada FullName ao
pipeline.
20. Clique duas vezes nele para abri-lo. No campo Nome da coluna derivada,
digite FullName. No campo Expressão, digite a seguinte expressão e clique
em OK:
TRIM(REPLACENULL(Title,"") + " " + REPLACENULL(FirstName,"") + " " +

TRIM(REPLACENULL(MiddleName,"") + " ") + REPLACENULL(LastName,"") + " " +

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:

Figura 2.22 – Criar uma tabela no Editor de destino OLE DB

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] (

26.     [CustomerID] int,

27.     [NameStyle] bit,

28.     [Title] nvarchar(8),

29.     [FirstName] nvarchar(50),


30.     [MiddleName] nvarchar(50),

31.     [LastName] nvarchar(50),

32.     [Suffix] nvarchar(10),

33.     [FullName] nvarchar(350)

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

Figura 2.24 – Adicionar um botão Layout na barra de ferramentas

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

O fluxo de dados agora deve se parecer com a seguinte captura de tela:

Figura 2.26 – Layout do fluxo de dados


38. Clique com o botão direito do mouse na seta (caminho) entre a
transformação DER_FullName e OLEDBDST e selecione Ativar
Visualizador de Dados, conforme mostrado na captura de tela a seguir:

Figura 2.27 – Fluxo de dados Habilitar o Visualizador de Dados

39. Feche o Visualizador de Dados. Agora, clique com o botão direito do


mouse em qualquer lugar no plano de fundo da tarefa Fluxo de Dados e
selecione Executar Tarefa, conforme mostrado na captura de tela a seguir:
Figura 2.28 – Executar o fluxo de dados

A Tarefa de Fluxo de Dados deve ser executada com êxito e você verá o


Visualizador de Dados com a nova coluna adicionada, conforme mostrado na
captura de telaa seguir:
Figura 2.29 – Visualizador de dados durante a execução do fluxo de dados

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.

Volte para o fluxo de controle do pacote e adicione uma tarefa Executar T-


SQL na seção Tarefas Favoritas da caixa de ferramentas SSIS. Clique duas
vezes nele para abri-lo. Defina as propriedades da seguinte maneira:

a) Nome: SQL_Truncate_SalesLT_CustomerFullName

b) Conexão: o gerenciador de conexões do pacote

c) SQLSourceType: Entrada direta

d) Instrução SQL: TABELA TRUNCATE SalesLT.CustomerFullName


Clique em OK para fechar o Editor de Tarefas Executar SQL. De volta ao
fluxo de controle, anexe a tarefa Fluxo de Dados à Tarefa Executar
SQL recém-criada.

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:

Figura 2.30 – Fluxo de controle após o layout automático

43. Salve o pacote, clique com o botão direito do mouse no pacote no


Gerenciador de Soluções (à direita do Visual Studio) e
selecione Renomear no submenu. Renomeie o pacote
para SalesLT.CustomerFullName.dtsx.
44. Finalmente, execute o pacote. Novamente, clique com o botão direito do
mouse sobre ele e selecione Executar pacote no submenu que aparece. O
pacote será executado e sua tela deve se parecer com a seguinte captura de
tela:
Figura 2.31 – Fluxo de controle após execução bem-sucedida

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

Carregando dados antes de sua


transformação
O ELT é muito semelhante ao ETL, mas com uma diferença crucial: a ordem das
etapas de transformação e carga são invertidas. Isso é muito útil com big data na
nuvem ou quando não temos uma ferramenta de ETL local. Esta receita será
muito mais simples do que a anterior, pois implementaremos o ELT usando um
banco de dados, então nenhuma ferramenta está envolvida aqui, exceto chamar a
tarefa ELT.
Ele também depende da receita anterior, Criando um pacote ETL simples, já que
usaremos os dados da tabela SalesLT.CustomerFullName para implementar o
padrão ELT.

Há essencialmente duas partes para esta receita:

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:

1. Na solução SSIS, clique com o botão direito do mouse na


pasta Pacotes SSIS e selecione Novo pacote SSIS. Renomeie o pacote
de Package1 para SalesLT.Customer.
2. Arraste e solte Executar Tarefa SQL da seção Favoritos da caixa de
ferramentas do SSIS para o fluxo de controle e nomeie-
o SQL_ELT_SalesLT_Customer.
3. Vamos adicionar a coluna FullName ao SalesLT.Customer. Abra o SSMS e
conecte-o ao nosso banco de dados do Azure. Verifique se o contexto está
definido para o banco de dados AdventureWorksLT, conforme mostrado na
captura de tela a seguir:
Figura 2.32 – Contexto do banco de dados AdventureWorksLT do SSMS

4. Na janela de consulta, digite a seguinte instrução DDL:


ALTER TABLE SalesLT.Customer ADD FullName NVARCHAR(350)
CopyExplain
5. Execute o comando e verifique se a coluna FullName foi adicionada com
êxito no Pesquisador de Objetos, conforme mostrado na captura de tela a
seguir:

Figura 2.33 – Coluna Nome completo do Pesquisador de Objetos do SSMS

6. Volte para o pacote SSIS. Clique duas vezes na


tarefa SQL_ELT_SalesLT_Customer para abrir o Editor de Tarefas
Executar SQL. Defina as propriedades da seguinte maneira:
a) Conexão: cmgr_etlinazurecookbook.database.windows.net.Adventure
WorksLT.ETLAdmin

b) SQL SourceType: Entrada direta

c) Instrução SQL:

UPDATE c

SET FullName = cfn.FullName

FROM SalesLT.Customer AS c

INNER JOIN SalesLT.CustomerFullName as cfn

ON c.CustomerID = cfn.CustomerID;
CopyExplain

Clique em OK para fechar o editor e voltar ao fluxo de controle.

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

O resultado deve ser semelhante à seguinte captura de tela:

Figura 2.34 – Resultado do Editor de Consultas do SSMS

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.

Capítulo 3: Criando e usando clusters de


Big Data do SQL Server 2019
Neste capítulo, você aprenderá a preparar e implantar um cluster de Big Data do
SQL Server 2019. Você aprenderá como os Clusters de Big Data podem ser
usados em operações de gerenciamento de dados, implementadas como
soluções do SQL Server Integration Services (SSIS). Mostraremos como usar o
SSIS para carregar dados em um armazenamento de arquivos HDFS (Big Data
Cluster Hadoop Distributed File System) e como executar operações básicas de
processamento de dados na plataforma Spark, e terminaremos o capítulo
demonstrando como recuperar dados de um cluster de Big Data, a ser usado em
um banco de dados hospedado localmente.
Depois de criar e implantar sua nova instância de Cluster de Big Data no Azure,
também mostraremos como manter com eficiência seu ambiente de
desenvolvimento suspendendo recursos específicos do Azure quando eles não
forem usados, o que permitirá reduzir o custo de sua assinatura do Azure.

Este capítulo aborda as seguintes receitas que o ajudarão a começar a usar


clusters de Big Data:

 Criando um cluster de Big Data do SQL Server 2019

 Parando e iniciando recursos do Azure

 Configurando um cluster de Big Data

 Carregando dados em um cluster de Big Data

 Extraindo dados de um cluster de Big Data

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

Os recursos exigidos pelo serviço Clusters de Big Data no Azure excedem os


termos e restrições da assinatura gratuita do Azure; portanto, você precisará de
uma assinatura do Azure Pay-As-You-Go para concluir as receitas neste
capítulo. Certifique-se de remover os recursos depois de concluir todas as receitas
para reduzir o custo de sua assinatura.

As instruções sobre como atualizar sua assinatura gratuita do Azure são


fornecidas na seção Preparação da primeira receita deste capítulo.
Criando um cluster de Big Data do SQL
Server 2019
Os Clusters de Big Data do SQL Server 2019 representam um novo recurso da
plataforma SQL Server, combinando serviços e recursos específicos usados no
gerenciamento e análise eficientes de conjuntos muito grandes de dados
principalmente não relacionais e permitindo que eles sejam usados junto com
dados relacionais hospedados em bancos de dados do SQL Server. Para atingir
esses objetivos principais, os clusters de Big Data implementam um sistema
de armazenamento de big data (HDFS) altamente escalável, recursos de
consulta altamente versáteis (Spark), o poder da computação distribuída
(Kubernetes) e uma infraestrutura de virtualização de dados (PolyBase).

Para implantar todos os recursos necessários que representam uma única


instância de Clusters de Big Data, você pode usar várias máquinas físicas ou
virtuais que podem ser hospedadas no local ou na nuvem.

Como não queremos que você carregue o fardo de fornecer a infraestrutura


necessária para hospedar a instância do Cluster de Big Data, você usará
os Serviços de Kubernetes do Azure (AKS), hospedados em um cluster de
Máquinas Virtuais (VMs) do Azure, fornecendo armazenamento de dados,
recursos computacionais e conectividade, bem como gerenciamento e
monitoramento.

O tamanho padrão da VM recomendado para hospedar um Cluster de Big Data é


a VM do Azure padrão ESv3, otimizada para memória, com oito núcleos de CPU,
executando o sistema operacional Linux. Cinco As VMs são necessárias para
hospedar uma instância AKS usada por uma instância do Cluster de Big Data do
SQL Server 2019.

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

Devido às restrições da assinatura de avaliação gratuita, você também precisará


de acesso a uma assinatura do Azure Pay-As-You-Go.

Se você não tiver acesso a uma assinatura do Azure Pay-As-You-Go que poderá


usar para as receitas deste livro, poderá atualizar a assinatura gratuita criada
no Capítulo 1, Introdução ao Azure e ao SSIS 2019.

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.

5. Na página Atualizar, insira um nome amigável da sua nova assinatura Pay-


As-You-Go (por exemplo, ) e marque a opção Sem suporte técnico, o que
significa que você não deseja adicionar um plano de suporte à sua
assinatura.ETL in Azure Cookbook

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.

Você pode saber mais sobre os planos de suporte de assinatura do Azure na


documentação do fornecedor, disponível em https://azure.microsoft.com/en-
us/support/plans/.

Quando estiver pronto, clique em Atualizar para continuar. Suas informações


de pagamento serão verificadas e talvez você precise atualizá-las, portanto,
mantenha seu cartão de crédito à mão. Quando a atualização for concluída,
uma nova mensagem aparecerá na área de Notificações do Azure.

Antes mesmo de tentar implantar um Cluster de Big Data no Azure, você


também deve estar familiarizado com as restrições de recursos atuais em sua
região. Como explicado na introdução desta receita, você precisará
de cinco VMs ESv3 padrão com 8 núcleos de CPU cada, para um total
de 40 núcleos. Você pode verificar as cotas de recursos seguindo estas
etapas:

6. No portal do Azure, abra o painel do Azure PowerShell clicando no ícone


do Cloud Shell, localizado à direita da caixa de texto de pesquisa, conforme
mostrado na captura de tela a seguir:

Figura 3.1 – Acessando o PowerShell no portal do Azure

7. Um painel Terminal deve ser aberto na parte inferior da janela do navegador,


conforme mostrado na captura de tela a seguir:
Figura 3.2 – O painel do Azure PowerShell

Se o PowerShell não for o idioma selecionado, selecione-o na caixa de


listagem, localizada na extremidade esquerda do menu do Cloud Shell.

8. Use o seguinte comando do PowerShell para verificar as cotas atuais na


região:East US
Get-AzVMUsage -Location "East US"
CopyExplain

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

9. Nos resultados retornados pelo comando, localize o contador:Get-


AzVMUsageStandard ESv3 Family vCPUs
Figura 3.3 – O resultado retornado pelo comando Get-AzVMUsage

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

Você só precisa solicitar um aumento de cota para o número de unidades


centrais virtuais de processamento (vCPUs) na região selecionada (, por
padrão) para 40 para a família ESv3 de VMs do Azure para a assinatura criada
no Capítulo 1, Introdução ao Azure e ao SSIS 2019. Nenhum outro pedido deve
ser necessário para completar as receitas deste capítulo.eastus

Até que as restrições de recursos atuais permitam implantar o número necessário


de VMs do tamanho recomendado, você não poderá continuar com essa receita.

Os casos de suporte com uma gravidade de impacto mínimo são resolvidos em 8


horas úteis, mas geralmente são resolvidos em minutos (é claro, dependendo de
quão ocupada a equipe de suporte está no determinado momento).
Você também precisará de um local em sua estação de trabalho onde os arquivos
específicos necessários neste capítulo serão mantidos:

1. Usando o Windows Explorer, crie uma nova pasta nomeada na unidade da


estação de trabalho.ETL-with-AzureC:\
2. Dentro da nova pasta, crie uma pasta para este capítulo, chamada , e dentro
desta, crie duas pastas adicionais, nomeadas e :Chapter03BDCFiles

Figura 3.4 – A pasta ETL-com-Azure e seu conteúdo

A captura de tela anterior mostra como as pastas precisam ser organizadas.

3. Use seu navegador de internet favorito e conecte-se ao local do GitHub para


este livro de receitas no https://github.com/PacktPublishing/ETL-with-Azure-
Cookbook.

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.

4. Localize a pasta no clone local do repositório do livro de receitas e copie-a


para a pasta criada anteriormente./Chapter03/FilesC:\ETL-with-Azure\
Chapter03\Files

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:

Figura 3.5 – As opções de implantação do Cluster de Big Data do SQL Server


2019

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.

Durante a instalação, quando solicitado pelo Controle de Conta de Usuário


do Windows para permitir que os aplicativos façam alterações no dispositivo,
clique em Sim para continuar.
Ponta

Você deve usar esse tempo para se familiarizar com a Declaração de


Privacidade da Microsoft e os Termos de Licença. Siga os links acima das
opções de implantação para acessar os documentos.

3. Quando todas as ferramentas necessárias tiverem sido instaladas com êxito


(marcadas pelo status Instalado na tabela Ferramentas Necessárias),
aceite a declaração de privacidade e os termos de licença e clique
em Selecionar para continuar. Deve levar cerca de um minuto para carregar
as configurações de implantação e iniciar o assistente de implantação.
4. Na página Perfil de configuração de implantação, verifique se o perfil de
configuração de implantação aks-dev-test está selecionado. Nesta
implantação de teste, você não precisará de nenhum recurso de alta
disponibilidade (HA).

Quando estiver pronto, clique em Avançar para continuar.

5. Na página Configurações do Azure, deixe a caixa de texto ID da assinatura


vazia para que a assinatura padrão do Azure seja usada e use os seguintes
valores para as outras configurações:

a) Novo nome do grupo de recursos: etlinazure-ch-3

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:

a) Nome do cluster AKS: etlinazure-ch-3-aks

b) Contagem de VMs: 5

c) Tamanho da VM: Standard_E8s_v3

Quando estiver pronto, clique em Avançar para continuar.

6. Na página Configurações do cluster, use como o nome do cluster,


deixe admin como o nome de usuário do administrador e atribua uma senha
para a conta de administrador.etlinazure-ch-3-aks-cluster

Deixe todas as configurações do Docker inalteradas.

Quando estiver pronto, clique em Avançar para continuar.

7. Na página Configurações do serviço, deixe todas as configurações padrão


inalteradas.

Quando estiver pronto, clique em Avançar para continuar.

8. Na página Resumo, revise todas as definições de configuração e verifique se


elas correspondem às instruções anteriores. Use os
botões Anterior e Avançar para navegar pelas páginas do assistente se
precisar fazer alterações.

Se todas as configurações estiverem corretas, clique em Salvar arquivos de


configuração para salvar a configuração no disco local da estação de
trabalho. Salve os arquivos na pasta.C:\ETL-with-Azure\Chapter03\BDC

Quando estiver pronto, clique em Script para Bloco de Anotações, após o


qual o assistente gera um novo bloco de anotações com um script baseado
nas definições de configuração fornecidas anteriormente.
9. Se esta for a primeira vez que você usa um Bloco de Anotações Python, a
caixa de diálogo Configurar Python para Blocos de Anotações deve ser
aberta.

Selecione Nova instalação do Python como o tipo de instalação ou


especifique a pasta onde uma instalação existente do Python está
localizada.

Quando estiver pronto, clique em Instalar para continuar.

O procedimento de download e instalação deve levar alguns minutos para ser


concluído.

Durante a instalação, você pode ser solicitado a atualizar quaisquer pacotes


Python instalados.

Clique em Sim para confirmar a atualização.

Quando a instalação for concluída, os resultados serão exibidos no


painel Tarefas.

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

Inspecione-o e clique em Executar células no menu Editor de bloco de


anotações para executar os scripts.

Como nenhuma ID de assinatura do Azure foi fornecida durante a


configuração, uma janela do navegador será aberta, solicitando que você
entre em sua conta do Azure. Use a conta criada no Capítulo 1, Introdução ao
Azure e ao SSIS 2019, com as credenciais correspondentes. A janela do
navegador pode abrir em segundo plano, então preste atenção a isso.

A instalação pode levar vários minutos para ser concluída; Aconselha-se


paciência.
Enquanto a instalação estiver em andamento, o processo pode não retornar
nenhuma mensagem; no entanto, a primeira mensagem retornada deve
conter a linha de comando que você pode executar em uma janela do prompt
de comando do Windows para controlar o progresso atual.

Após a conclusão da instalação, o bloco de anotações deve efetuar login no


Cluster de Big Data recém-criado e recuperar os endereços de ponto de
extremidade. Algumas das informações retornadas nos resultados serão
necessárias posteriormente; portanto, salve o Bloco de Anotações
novamente, desta vez incluindo os resultados mais recentes, para que as
informações recuperadas durante a instalação estejam agora disponíveis no
Bloco de Anotações para uso posterior.

Ponta

Um dos benefícios significativos proporcionados pelos Notebooks é a


capacidade de não apenas exibir os resultados das operações dentro do
Notebook, mas também de salvá-los em um arquivo para ser
examinadoposteriormente.

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:

Figura 3.6 – Conectando-se à instância mestra do SQL Server a partir do


Bloco de Anotações de implantação
Siga o link. Pode levar alguns instantes para que a conexão seja feita, então é
aconselhável paciência. Depois que a conexão for feita, as informações sobre
a instância mestra do SQL Server do seu primeiro Cluster de Big Data
deverão aparecer em uma nova guia ADS.

12. Na coluna esquerda da guia, em Monitoramento, clique em Cluster de Big


Data do SQL Server para exibir as propriedades do seu Cluster de Big Data,
conforme mostrado na captura de tela a seguir:

Figura 3.7 – Verificando a instância do Cluster de Big Data após a


implantação

13. Na faixa de opções do menu da janela, selecione Painel de Cluster. Após


alguns minutos, o estado atual de todas as partes do seu cluster de Big Data
recém-criado deve ser exibido, conforme mostrado na próxima captura de
tela:
Figura 3.8 – O painel do Cluster de Big Data

Em circunstâncias normais, todos os seis elementos devem estar no


estado Pronto, com um estado de saúde Saudável.

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.

Dependendo da situação exata, eventualmente a única solução bem-sucedida


pode ser simplesmente remover todo o Grupo de Recursos da sua
assinatura de avaliação e começar de novo.

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

Para fins de desenvolvimento e teste, você pode usar certificados


autoassinados com segurança para proteger a comunicação entre o servidor
e os aplicativos cliente; no entanto, em um ambiente de produção, você
normalmente usaria um certificado emitido por uma autoridade de
certificação (CA) raiz. Para usar um certificado de autoridade de certificação
raiz existente, você pode usar o CER101 - Configurar cluster com
certificados autoassinados usando o bloco de anotações Python raiz
existente, em vez de um. CACER100

17. Quando o bloco de anotações Python for carregado, inspecione-o e clique


em Executar Células no menu da guia ADS para executar o script.CER100 -
Configure Cluster with Self Signed Certificates

Infelizmente, durante a execução, você pode ter um ou mais problemas:

a) Se a execução do bloco de anotações principal (o CER100) falhar (por


exemplo, ao executar a célula), você pode contornar esse problema
executando cada um dos blocos de anotações associados individualmente.
Eles estão listados na ordem correta na seção Relacionados do caderno
principal; seus nomes começam com CER (você pode ignorar o
notebook CAN100).Run the notebooks

b) Se a execução de um bloco de anotações individual falhar, inspecione as


mensagens de erro retornadas pela execução da célula com falha. Eles
podem conter referências a blocos de anotações adicionais que você pode
usar para resolver o problema. Depois de carregar e executar quaisquer
blocos de anotações adicionais, repita a execução do bloco de anotações
com falha anterior — dependendo do bloco de anotações específico, talvez
seja necessário executar todas as células ou executar cada célula individual,
começando com a que falhou originalmente.

c) A célula do bloco de anotações usará o PowerShell para baixar o


certificado a ser instalado em sua estação de trabalho. Preste atenção à
janela do PowerShell, pois ela pode abrir em segundo plano; Ele abre uma
caixa de diálogo solicitando que você confirme a instalação do certificado. A
execução não continuará até que você responda.Install the Root CACER010 -
Install generated Root CA locally

Depois que todos os notebooks tiverem sido executados com êxito, os


certificados serão instalados em todos os pontos de extremidade do seu
Cluster de Big Data, bem como em sua estação de trabalho, o que agora
deve permitir que os aplicativos cliente se conectem.

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

Ao usar certificados autoassinados para proteger recursos do servidor (por


exemplo, pontos de extremidade), esses certificados não são confiáveis pelos
aplicativos cliente, pois sua validade não pode ser comprovada por meio de
uma CA apropriada. Isso pode impedir que os aplicativos cliente usem o
recurso protegido completamente.

Por exemplo, navegadores de internet ou aplicativos cliente baseados em


navegador avisarão o usuário sobre essas circunstâncias e podem exigir
interação do usuário antes que uma conexão possa ser feita. Aplicativos
cliente que não são navegadores, por outro lado, podem ser capazes de
estabelecer a conexão com esse recurso de forma segura, desde que tenham
acesso às informações necessárias para estabelecer confiança.
O notebook CER010 instala o certificado autoassinado em sua estação de
trabalho de forma segura e, assim, disponibiliza as informações necessárias
para os aplicativos cliente em execução em sua estação de trabalho.

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

O recurso que você acabou de criar em sua assinatura do Azure não é gratuito;


você já está sendo cobrado pelo seu uso. Para reduzir o custo da sua assinatura,
recomendamos que você conclua as etapas 1 a 4 da próxima receita, Parando e
iniciando recursos do Azure.

Parando e iniciando recursos do Azure


Como observado várias vezes ao longo deste livro de receitas, nem todos os
recursos ou serviços do Azure são gratuitos; na verdade, a maioria deles
representa serviços comerciais (afinal, o Azure é hospedado por uma empresa
privada que, assim como sua organização ou você pessoalmente, ao oferecer
serviços a seus clientes para pagamento, representa um cliente para vários outros
fornecedores, que também esperam ser pagos por seus serviços).

Em um ambiente de produção, onde os serviços são entregues a clientes


pagantes, você normalmente só interromperia seus recursos durante a
manutenção ou quando eles tivessem sido descontinuados. No entanto, em um
ambiente de desenvolvimento e teste, sem clientes pagantes, você pode querer
parar seus recursos simplesmente para reduzir custos.

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.

No momento, seu principal objetivo é aprender a suspender as VMs. Você seguirá


a segunda parte desta receita apenas quando realmente precisar de acesso ao
Big Data Cluster em receitas posteriores.

Como fazer...
Use seu navegador de internet favorito para fazer logon no portal do Azure
em https://portal.azure.com/.

1. Na Home page da assinatura usada na receita anterior, intitulada Criando um


cluster de Big Data do SQL Server 2019, abra o menu à esquerda e localize o
item Todos os recursos:
Figura 3.9 – Acessando todos os recursos no portal do Azure

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.

O nome do VMSS usado para hospedar o cluster de Big Data criado


anteriormente neste capítulo deve começar com e terminar com:aks-
nodepool1--vmss

Figura 3.10 – Acessando o VMSS de uma instalação do Kubernetes do Azure

Na faixa de opções do menu de recursos (não no menu do navegador, é


claro), clique em Deallocate.

3. Um aviso deve aparecer, informando que todas as instâncias de VM serão


desalocadas quando você desalocar o VMSS.

Como é exatamente isso que você deseja fazer agora, clique em Sim para


continuar.

4. Na coluna esquerda, em Configurações, clique em Instâncias para abrir


informações sobre as instâncias de VM usadas pelo Cluster de Big Data.
Deve levar alguns minutos para que as VMs sejam suspensas.

No menu de recursos, clique em Atualizar para observar o estado atual das


instâncias:

Figura 3.11 – As instâncias de VM desalocadas

Depois que as VMs forem suspensas, seu status deverá ser Interrompido


(deslocalizado). Isso significa que sua instância do Big Data Cluster está
offline e não está mais contribuindo para o aumentoda sua assinatura.

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.

Por exemplo, na página Instâncias do VMSS, marque a caixa antes de cada


VM.

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

Usando o comando Reiniciar em vez de Iniciar, as VMs serão desativadas e


reiniciadas, e não retornarão ao estado em que estavam antes de serem
suspensas; Uma reinicialização também pode levar muito mais tempo para
ser concluída. Use Reiniciar somente se quiser que as máquinas sejam
reiniciadas sem retornar aos estados salvos.

Para os propósitos desta receita, e da maioria das receitas deste livro de


receitas, simplesmente iniciar as VMs de seu estado suspenso deve ser
suficiente – afinal, provavelmente foi você quem as suspendeu em primeiro
lugar.

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.

Se sua instância de Cluster de Big Data não estiver listada no


painel Conexões, consulte a Etapa 11 da primeira receita deste capítulo,
intitulada Criando um cluster de Big Data do SQL Server 2019, para obter
mais informações.

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

Configurando um cluster de Big Data


Nesta receita, você adicionará objetos de armazenamento de dados à sua
instância de Cluster de Big Data — em um banco de dados do SQL Server, bem
como no repositório de arquivos. Você também carregará uma pequena amostra
de dados no repositório de arquivos.

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

1. No ADS, no menu Exibir, clique em Extensões para exibir o explorador de


extensões ADS:
Figura 3.12 – Instalando extensões ADS

Procure a frase para localizar a extensão na coleção.data virtualization

2. Selecione a extensão Data Virtualization na lista e clique em Instalar para


iniciar a instalação. O download e a instalação devem ser concluídos em
poucos minutos, dependendo da sua conexão com a internet. Você também
deve ser notificado sobre o progresso e a conclusão da instalação no
painel Saída na parte inferior da janela. Agora você está pronto para
configurar seu cluster de Big Data. Antes de começar, verifique se o Cluster
de Big Data está ativo e em execução verificando o estado do VMSS no portal
do Azure.

Se as VMs forem interrompidas, siga as etapas 4 a 5 da receita anterior


Parando e iniciando recursos do Azure.

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.

Se uma conexão não estiver disponível, a maneira mais rápida de acessar o


servidor é abrir o Bloco de Anotações criado na primeira receita deste
capítulo. Ele deve ser salvo na pasta em sua unidade local.C:\ETL-with-Azure\
Chapter03\BDC

Na parte inferior do Bloco de Anotações, siga o link Clique aqui para se


conectar à instância mestra do SQL Server.
A Home page do Cluster de Big Data agora deve ser aberta em uma nova
guia ADS, e sua conexão também deve ser adicionada à guia Conexões,
em SERVIDORES e em Cluster de Big Data do SQL Server:

Figura 3.13 – Conexão com um cluster de Big Data no ADS

2. Na guia Conexões, clique com o botão direito do mouse no nó da instância


do SQL Server representado pelo endereço IP do seu Cluster de Big Data e
selecione Nova Consulta no menu de atalho:
Figura 3.14 – Abrindo uma nova janela de consulta no ADS

3. Use os seguintes comandos Transact-SQL (T-SQL) para criar um novo


banco de dados:
4. USE master;

5. GO

6. CREATE DATABASE Staging;

GO
CopyExplain

Execute os comandos clicando em Executar na guia do editor de consultas


ou pressionando F5 no teclado.

Na guia Conexões, expanda o nó, na instância do Cluster de Big Data. O


novo banco de dados deve ser listado lá, como mostrado na captura de tela a
seguir:Databases

Figura 3.15 – A nova base de dados

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:

Figura 3.16 – Adicionando um novo diretório HDFS

Na caixa de diálogo Inserir nome do diretório, use como o nome do


diretório.NewPeople

Quando estiver pronto, pressione Return para confirmar o nome.

O novo diretório agora deve aparecer na guia Conexões, no nó HDFS.

Crie outra pasta, chamada , repetindo o procedimento.UnknownPeople

8. Clique com o botão direito do mouse na pasta e, desta vez,


selecione Carregar arquivos no menu de atalho.NewPeople
9. Na caixa de diálogo Abrir, navegue até a pasta, selecione o arquivo e clique
em Carregar para iniciar o processo.C:\ETL-with-Azure\Chapter03\
FilesNewPeople.csv
Deve levar apenas um momento para carregar o arquivo de exemplo de
45 kilobytes (KB). Expanda a pasta para vê-la. Se o arquivo não estiver
listado, clique com o botão direito do mouse na pasta e
selecione Atualizar no menu de atalho para atualizar seu conteúdo.NewPeople

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:

Figure 3.17 – Creating an external table from CSV files


It should take a few moments to load the wizard, including filling in all known
settings into the fields of the Select the destination database for your
external table page, as shown in the following screenshot:

Figure 3.18 – The external table properties

Your Big Data Cluster instance should be selected as the destination server,


and the database should be used as the location of the external table.Staging
By default, the directory name is also used as the external table name; is used
for the table schema; and the wizard also generates a name for the external
file format object, based on the directory name.dbo

Leave all the settings unchanged.

When ready, click Next to continue.

11. The first 50 rows of the file are displayed so that you can verify whether the
column delimiters were recognized correctly:

Figure 3.19 – The CSV file data

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.,"

When ready, click Next to continue.

12. On the Modify Columns page, you are presented with the external table
schema as it was determined from the row sample:

Figure 3.20 – The external table column definitions

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

When it comes to string data types, the Create External Table wizard only


supports two lengths: 50 characters or max; therefore, more often than not,
you will have to make changes to the automatically generated script in order to
correct the data types.

Click Next to continue.

13. On the Summary page, you can inspect the configuration. Do not click Create


Table, as the table definition needs to be corrected manually before the table
can be created:

Figure 3.21 – The external table configuration summary

When ready, click Generate script, to instruct the wizard to prepare the T-


SQL script with all the required object definitions.

Give it a moment, and then click Cancel to close the wizard.

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

Change the length of the column from to , as shown in the preceding


screenshot.EmailAddress50256

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

In the Connection dialog, select the connection to your Big Data Cluster


instance from the list of recent connections. If the correct connection is not
listed, you will have to provide the server name and the credentials.

Make sure that the database is selected in the Database list box.Staging

When ready, click Connect to continue the execution.


If the commands have completed successfully, the table should be listed in
the Connections tab, under the Tables node of the database of your Big Data
Cluster instance, as shown in the following screenshot:Staging

Figure 3.24 – The new external table

16. In SQL Server Management Studio (SSMS), make sure the Object


Explorer is connected to your local SQL Server instance (, or ), and then
select the database in the Object Explorer. Press Ctrl + O on your keyboard,
or select Open… from the File menu, to open a new
file.localhostMSSQL2019WideWorldImporters
17. In the Open File dialog, navigate to the folder you used when you downloaded
a clone of the repository. Locate the folder, and in it the file. Open it.ETL-with-
Azure-Cookbook\Chapter03\ETLinAzure\ScriptsChapter03_OnPremises.sql

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

a) —a procedure that uses data in the database to generate a list of names


and email addressesApplication.NewPeople_ListWideWorldImporters

b) —a new tableApplication.UnknownPeople

After creating the procedure, you can test it by executing the command that


follows the procedure definition.EXEC

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

Select SQL Authentication, use as the username, and supply the password


you created when deploying the instance to Azure.admin

20. In the Object Explorer, locate the database of the remote SQL Server


instance, and again press Ctrl + O on your keyboard, or select Open… from
the File menu, to open a new file. In the Open File dialog, navigate to
the folder as before, and this time open the file.Staging\Chapter03\ETLinAzure\
ScriptsChapter03_Cloud.sql

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

a) —a new database tabledbo.ExistingPeople


b) —another external table, hosted on the Big Data Cluster HDFS file
storedbo.UnknownPeople

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.

Carregando dados em um cluster de Big


Data
Nesta receita, você criará um pacote SSIS usado para carregar dados em um
banco de dados hospedado na instância remota do SQL Server.

O pacote SSIS contém dois fluxos de controle:

 Um extrai informações importantes do banco de dados de linha de negócios e


as carrega em um banco de dados hospedado no AzureStaging
 O outro simula um processo que entrega dados de uma fonte diferente (por
exemplo, gerenciados por outro departamento em sua organização ou por
outra organização completamente) e os carrega em seu Cluster de Big Data
que também está hospedado no Azure
O objetivo deste pacote SSIS é disponibilizar os dados necessários no local
remoto para processamento posterior. O pacote SSIS que você vai projetar na
última receita deste capítulo, intitulado Extraindo dados de um cluster de Big Data,
depende dos dados disponibilizados pelo pacote projetado nesta receita.

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

O pacote SSIS nesta receita usa o utilitário de linha de comando curl para


transferir dados para o destino remoto. Esse utilitário já deve estar disponível em
instalações do Windows Server 2019, bem como nas versões mais recentes do
Windows 10. Se, por algum motivo, o utilitário não estiver disponível em sua
estação de trabalho, você poderá instalar a versão mais recente a partir
do https://curl.haxx.se/.

Como fazer...
Localize o clone do repositório GitHub do livro de receitas que você implantou em
sua estação de trabalho.

1. Dentro do repositório local, localize a pasta e abra a solução no SSDT (SQL


Server Data Tools) (Visual Studio 2019).\ETL-with-Azure-Cookbook\Chapter03\
StarterETLinAzure.sln

Deve levar cerca de um minuto para carregar a solução no Visual Studio:


Figura 3.25 – A solução ETLinAzure no Gerenciador de Soluções SSDT

No Gerenciador de Soluções, você verá um único projeto SSIS, chamado ,


contendo os dois pacotes SSIS a seguir:ETLinAzure_BDC

a) BDC_Load.dtsx

b) BDC_Extract.dtsx

2. Abra o pacote clicando duas vezes em seu nó no Gerenciador


de Soluções ou clicando com o botão direito do mouse nele e
selecionando Abrir no menu de atalho.BDC_Load.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.

O pacote contém os dois contêineres de sequência a seguir:


a) Simule o carregamento de dados de origem no BDC — esse fluxo de
controle será usado para carregar novos dados no cluster de Big Data.

b) Carregar Dados de Referência no Banco de Dados Remoto — esse fluxo


de controle será usado para carregar dados existentes em uma tabela de
referência na instância do SQL Server do Azure.

Você pode ver o fluxo de controle do pacote na seguinte captura de


tela:BDC_Load.dtsx

Figura 3.26 – O fluxo de controle do pacote SSIS BDC_Load.dtsx

3. Na guia Parâmetros do editor de pacotes, você verá três parâmetros:

a) — o endereço do gateway do Cluster de Big Data para acessar arquivos


HDFSHDFSGatewayAddress

b) —a senha da conta de administrador usada ao criar a instância do SQL


ServerHDFSRootPassword

c) —o caminho e o nome do arquivo de um arquivo simples usado na


transferência de dados da instância local do SQL Server para a instância do
Cluster de Big Data:NewPeopleFlatFilePath
Figura 3.27 – Os parâmetros do pacote

Os dois primeiros parâmetros são marcados como sensíveis, pois contêm


informações que requerem proteção especial. Altere os valores desses dois
parâmetros para que o parâmetro contenha o endereço IP do acesso do
gateway aos arquivos HDFS no Cluster de Big Data e o parâmetro contenha a
senha usada quando você criou a instância do Cluster de Big
Data.HDFSGatewayAddressHDFSRootPassword

Deixe o valor do parâmetro inalterado.NewPeopleFlatFilePath

Volte para a guia Editor de fluxo de controle.

4. No menu Exibir, em Outras Janelas, selecione Variáveis para abrir


o painel Variáveis.

O pacote usa as duas variáveis a seguir:

a) —Uma cadeia de caracteres que representa os argumentos que serão


usados com o utilitário de linha de comando curl com espaços reservados
que serão substituídos por valores reais em tempo de
execução.CurlCliArgumentsPattern

b) —a cadeia de caracteres que manterá a coleção completa de


argumentos curl determinada em tempo de execução. O valor padrão dessa
variável é —puramente para satisfazer a validação da tarefa Executar
Processo:CurlCliArguments--help
Figura 3.28 – As variáveis de pacote

Não faça alterações nas variáveis e feche o painel Variáveis.

5. No Editor de Tarefas de Script, no contêiner Simular Carregando Dados


de Origem no BDC, abra a tarefa de script Preparar CLI de curl clicando
duas vezes nela ou clicando com o botão direito do mouse nela e
selecionando Editar... no menu de atalho:

Figura 3.29 – O Editor de Tarefas de Script

Na página Script do Editor de Tarefas de Script, inspecione as variáveis


somente leitura e as variáveis de leitura/gravação que foram configuradas
para uso na tarefa de script.

Não faça alterações na configuração.


6. Clique em Editar Script... para abrir a definição da tarefa de script e dar
ao Visual Studio Tools for Applications (VSTA) alguns momentos para
iniciar.

A definição da tarefa de script deve conter um método, chamado .Main

Quando a tarefa de script é executada, esse método lerá os valores dos


parâmetros de pacote especificados e da variável e os usará para atribuir o
valor da variável.CurlCliArgumentsPatternCurlCliArguments

Feche o VSTA e, em seguida, clique em Cancelar para cperder o Editor de


tarefas de script.

7. Abra a tarefa de fluxo de dados Preparar novos dados de pessoas


(WideWorldImporters) no editor de fluxo de dados clicando duas vezes nele
ou clicando com o botão direito do mouse nele e selecionando Editar... no
menu de atalho:

Figura 3.30 – A tarefa de fluxo de dados Preparar dados de novas pessoas


(WideWorldImporters)

Essa tarefa de fluxo de dados implementa uma movimentação de dados


simples, onde os dados são extraídos de uma única fonte (Pessoas
de Origem) e, em seguida, são carregados em um único destino (Novas
Pessoas), sem transformações adicionais.

8. Clique duas vezes no componente de origem Pessoas de origem ou clique


com o botão direito do mouse nele e selecione Editar... no menu de atalho,
para abrir o Editor de código-fonte OLEDB.
Na página Gerenciador de Conexões do editor, você pode ver que o
componente de origem se conecta ao gerenciador de conexões e que ele usa
o procedimento para carregar os dados no pipeline de fluxo de
dados.WideWorldImporters_Local_OledbApplication.NewPeople_List

Não faça alterações no componente e clique em Cancelar para fechar


o Editor de código-fonte OLEDB.

9. Abra o componente de destino Novas Pessoas. Na página Gerenciador de


Conexões do Editor de Destino de Arquivo Simples, você pode ver que
esse componente se conecta ao gerenciador de conexões de arquivo simples
e que está definido para substituir qualquer conteúdo existente pelos dados
recebidos do pipeline de fluxo de dados.NewPeopleFlatFile

Não faça alterações no componente e, em seguida, clique em Cancelar para


fechar o Editor de destino de arquivo simples.

10. No painel Gerenciadores de Conexões, abaixo do painel do editor, localize o


gerenciador de conexões. Abra-o.WideWorldImporters_Local_Oledb

Isso fornece uma conexão com o banco de dados na instância local do SQL
Server.WideWorldImporters

Clique em Cancelar para fechar o gerenciador de conexões, pois nenhuma


alteração é necessária.

11. Agora, localize o gerenciador de conexões e abra-o.NewPeopleFlatFile

Isso fornece uma conexão com um arquivo simples, localizado em sua


estação de trabalho. O arquivo usa codificação para armazenar dados em
formato de texto.UTF-8

Clique em Cancelar para fechar o gerenciador de conexões, pois nenhuma


alteração é necessária aqui.

Volte para o editor de fluxo de controle.


12. Na Caixa de Ferramentas SSIS, arraste uma tarefa Executar
Processo para o contêiner Simular Carregamento de Dados de Origem no
BDC, altere seu nome para Carregar Novos Dados de Pessoas e conecte a
restrição de precedência da tarefa de fluxo de dados Preparar Novos Dados
de Pessoas (WideWorldImporters) à tarefa recém-adicionada.
13. Abra a tarefa Carregar Novo Processo de Execução de Dados de Pessoas
clicando duas vezes nela ou clicando com o botão direito do mouse nela e
selecionando Editar... no menu de atalho.

No Editor de Tarefas Executar Processo, na página Processo, defina as


seguintes propriedades:

a) RequireFullName: false

b) Executável: curl

Deixe o restante das propriedades inalteradas.

14. Na página Expressões, abra o Editor de Expressões de Propriedade,


clicando no símbolo de reticências no lado direito da linha Expressões.

Selecione a propriedade Arguments e abra o Construtor de Expressões,


clicando no símbolo de reticências no lado direito da linha de propriedades.

15. No Construtor de Expressões, arraste a variável da coleção Variables and


Parameters na coluna esquerda para a caixa de
texto Expression:CurlCliArguments
Figura 3.31 – O Construtor de Expressões

Clique em Avaliar Expressão para ver se a expressão está correta e se


retorna o valor atual da variável correspondente.

Quando estiver pronto, clique em OK para confirmar a expressão.

Em tempo de execução, a propriedade Arguments será preenchida com o


valor da variável. Essa variável é preenchida pela tarefa de script Preparar
curl CLI.CurlCliArguments

16. Se a configuração da expressão estiver concluída, conforme mostrado na


captura de tela a seguir, clique em OK para fechar o Editor de expressões
de propriedade:
Figura 3.32 – O Editor de expressões de propriedade

17. De volta à página Processo, agora você pode verificar as propriedades


preenchidas por valores literais e as propriedades preenchidas por uma
expressão:

Figura 3.33 – O Editor de Tarefas do Processo de Execução

Quando estiver pronto, clique em OK para confirmar a configuração.


Salve a solução.

18. Crie um novo gerenciador de conexões, clicando com o botão direito do


mouse na tela vazia do painel Gerenciadores de Conexões e
selecionando Nova Conexão OLEDB... no menu de atalho.

Na caixa de diálogo Configurar o Gerenciador de Conexões OLEDB, clique


em Novo... para criar uma nova conexão e, em seguida, no editor do
Gerenciador de Conexões, verifique se o SQL Server Native Client está
selecionado como o provedor.

Use as seguintes configurações para o restante das propriedades:

a) Nome do servidor: Endereço Front-End da Instância Mestre do SQL


Server da sua instância do Cluster de Big Data

b) Autenticação: SQL Server Authentication

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

e) Salvar minha senha: Marcado

f) Selecione ou insira um nome de banco de dados: Staging

Clique em Testar conexão para verificar as configurações.

Se o teste for bem-sucedido, clique em OK para confirmar as configurações;


caso contrário, faça as alterações necessárias com base nas informações
fornecidas por quaisquer mensagens de erro.

Observação importante

A senha será salva no pacote SSIS de forma criptografada; No entanto, você


terá que inseri-lo novamente sempre que quiser fazer alterações nesse
gerenciador de conexões.
19. Altere o nome do gerenciador de conexões recém-criado
para .Staging_BDC_Oledb

Clique com o botão direito do mouse no gerenciador de conexões recém-


criado e selecione Converter em Conexão de Projeto no menu de atalho
para promover o gerenciador de conexões a um recurso de projeto.

20. Na Caixa de Ferramentas SSIS, arraste uma tarefa Executar SQL para o


contêiner Carregar Dados de Referência no Banco de Dados Remoto,
altere seu nome para Remover Dados Existentes (Preparo) e conecte uma
restrição de precedência da nova tarefa à tarefa de fluxo de dados Carregar
Pessoas Existentes (WideWorldImporters to Staging) existente.
21. Abra a tarefa recém-adicionada e, na página Geral, use as seguintes
configurações para definir as propriedades:

a) Tipo de conexão: OLE DB

b) Conexão: Staging_BDC_Oledb

c) SQLSourceType: Direct input

d) SQLStatement: TRUNCATE TABLE dbo.ExistingPeople;

Ponta

Em vez de digitar a instrução T-SQL na caixa de texto, copie-a do script


usado na receita intitulada Configurando um cluster de Big Data,
anteriormente neste capítulo.SQLStatementChapter03_Cloud.sql

Quando estiver pronto, clique em OK para confirmar a configuração.

Salve a solução.

22. Abra o fluxo de dados Carregar Pessoas Existentes (WideWorldImporters


to Staging) no editor de Fluxo de Dados.

Inspecione o componente de origem Pessoas Existentes de Origem


(WideWorldImporters). Você pode ver que ele se conecta ao gerenciador de
conexões e extrai os dados da
tabela.WideWorldImporters_Local_OledbEmailAddressApplication.People

Deixe o componente de origem inalterado e clique em Cancelar para fechar o


editor.

23. Na Caixa de Ferramentas SSIS, arraste uma tarefa de Destino OLE


DB para o fluxo de dados, altere seu nome para Novas Pessoas Existentes
(Preparo) e conecte o caminho de dados do componente de origem ao
componente de destino recém-adicionado.

Na página Gerenciador de Conexões, use as seguintes configurações para


configurar o componente de destino:

a) Gerenciador de conexões OLE DB: Staging_BDC_Oledb

b) Modo de acesso aos dados: Table or view – fast load

c) Nome da tabela ou da vista: dbo.ExistingPeople

Deixe o restante das configurações inalteradas.

24. Na página Mapeamentos, verifique se a coluna de origem está conectada à


coluna de destino.

Quando estiver pronto, clique em OK para confirmar a configuraçã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 em sua instância local do SQL Server, a tabela deve


estar vazia.WideWorldImportersApplication.UnknownPeople
b) No banco de dados do seu Cluster de Big Data, as tabelas e as tabelas
devem estar vazias, enquanto a tabela deve conter 1.000
linhas.Stagingdbo.ExistingPeopledbo.UnknownPeopledbo.NewPeople

26. No SSDT, execute o pacote no modo de depuração e observe a execução de


cada fluxo de dados.BDC_Load.dtsx

Quando o arquivo simples é processado pelo utilitário curl, uma janela de


prompt de comando será aberta, permitindo que você veja as mensagens
recebidas da execução.

Todas as operações devem ser concluídas com êxito dentro de alguns


minutos.

Se houver erros, verifique as mensagens de erro e faça as correções


necessárias antes de repetir a execução do modo de depuração.

27. Pare a execução e inspecione as tabelas novamente:

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

b) No banco de dados, a tabela ainda deve estar vazia, enquanto a tabela


deve conter 806.976 linhas, e a tabela deve conter 1.029
linhas.Stagingdbo.UnknownPeopledbo.NewPeopledbo.ExistingPeople

Você pode deixar as ferramentas abertas, pois você precisará delas na


receita a seguir.

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.

Extraindo dados de um cluster de Big


Data
Nesta receita, você concluirá o desenvolvimento de uma solução SSIS usada para
extrair dados de um banco de dados hospedado em uma instância de Cluster de
Big Data no Azure e carregá-los em um banco de dados hospedado na instância
local do SQL Server.

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.

Em geral, determinar o delta dificilmente representa uma tarefa digna dos


recursos disponíveis em Clusters de Big Data ou um caso típico para usar o
Spark; no entanto, ele representa um elemento muito significativo no
armazenamento de dados eficiente.

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.

Certifique-se de que a solução esteja aberta no SSDT; Esta é a mesma solução


que você já usou na receita anterior. Abra o ADS se ainda não estiver
aberto.Chapter03\Starter\ETLinAzure\ETLinAzure.sln

1. No ADS, no painel Conexões, expanda o nó que representa a instância do


Cluster de Big Data e, em Bancos de Dados, selecione o banco de
dados.Staging

Pressione Ctrl + O no teclado ou selecione Abrir arquivo... no


menu Arquivo para abrir a caixa de diálogo Abrir arquivo. No clone local do
repositório GitHub do livro de receitas, localize a pasta e, nela, o Python
Spark Notebook. Abra-o.Chapter03\ScriptsChapter03_UnknownPeople.ipynb

2. Inspecionar o Caderno; ele deve conter uma única célula.

O script cria dois quadros de dados:

a) , extraindo dados de um ou mais arquivos de valores separados por


vírgulas (CSV) no diretório HDFSnewPeopleNewPeople

b) , extraindo dados da tabela do banco de


dadosexistingPeopledbo.ExistingPeople

Em seguida, o script exibe 10 linhas de cada quadro de dados.

Depois disso, o script cria um terceiro quadro de dados, chamado , unindo os


dois primeiros quadros de dados usando uma anti-junção à esquerda na
coluna, que retorna apenas linhas do primeiro quadro de dados (à esquerda)
que não existem no segundo quadro de dados (à
direita).unknownPeopleEmailAddress

As contagens de linhas de todos os três quadros de dados são impressas em


seguida, seguidas pelas colunas , e do quadro de dados que está sendo
gravado de um ou mais arquivos CSV no diretório HDFS na instância do
Cluster de Big Data.FirstNameLastNameEmailAddressunknownPeopleUnknownPeople

3. Clique em Executar células para executar o script. Se for solicitada uma


conexão, certifique-se de se conectar ao banco de dados na instância do
Cluster de Big Data.Staging

Observação importante

Ocasionalmente, a execução pode ser interrompida por um ou mais erros (por


exemplo, por "" ou por "erros".Error sending http request and maximum retry
encountered.Invalid status code '404' from … with error payload:
{"msg":"Session '1' not found."}

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.

Após uma execução bem-sucedida, você pode salvar o Bloco de Anotações


com os resultados exibidos para referência.

4. No ADS, na guia Conexões, localize o diretório sob o nó HDFS e expanda-o


para ver seu conteúdo. Se nenhum arquivo for exibido, clique com o botão
direito do mouse no nó do diretório e selecione Atualizar no menu de atalho
para recarregar os dados.UnknownPeople

Observação importante

Por padrão, as operações do Spark em big data resultam em vários arquivos


quando os dados são persistentes no armazenamento de arquivos HDFS.
Cada arquivo representa uma única partição de dados que foi gerada quando
os quadros de dados foram processados — o paralelismo representa um
aspecto importante da infraestrutura de Clusters de Big Data. Os recursos de
virtualização de dados dessa infraestrutura também permitem que
os dados sejam apresentados logicamente como um único conjunto, mesmo
que ele abranja fisicamente vários arquivos no armazenamento de arquivos
HDFS.

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

No script, execute a consulta que recupera dados da tabela externa. Essa


tabela agora deve conter 805.948 linhas.dbo.UnknownPeople

6. No SSDT, no Gerenciador de Soluções, localize o pacote SSIS. Abra-o. O


pacote deve conter um único fluxo de controle dentro do contêiner de
sequência, consistindo em uma tarefa Executar SQL que trunca a tabela no
banco de dados local e um fluxo de dados incompleto:BDC_Extract.dtsxExtract
Data from BDCApplication.UnknownPeopleWideWorldImporters

Figura 3.34 – O fluxo de controle do pacote SSIS BDC_Extract.dtsx

7. Abra o fluxo de dados Baixar Dados de Pessoas Desconhecidas (Preparo


para WideWorldImporters) no designer de Fluxo de Dados. O fluxo de
dados contém uma transformação e um componente de destino, mas
nenhuma origem.
Essa também é a razão pela qual a tarefa de fluxo de dados atualmente tem
um erro e está até impedindo que o pacote SSIS seja executado.

8. Na caixa de ferramentas do SSIS, arraste um componente OLE DB


Source para o fluxo de dados; altere seu nome para , e abra-o.Source Unknown
People

No Editor de código-fonte OLE DB, na página Gerenciador de Conexões,


use as seguintes configurações para configurar o componente de origem:

a) Gerenciador de conexões OLE DB: Staging_BDC_Oledb

b) Modo de acesso aos dados: Table or view

c) Nome da tabela ou da vista:[dbo].[UnknownPeople]

Figura 3.35 – O Editor de código-fonte OLE DB

A captura de tela anterior mostra as configurações corretas. Você pode clicar


em Visualizar... para verificá-los executando a consulta e observando as
primeiras linhas.

9. Na página Colunas, verifique se todas as três colunas estão selecionadas.


Quando estiver pronto, clique em OK para confirmar a configuração.

10. No editor de Fluxo de Dados, conecte o caminho de dados do


componente Pessoas Desconhecidas de Origem à transformação Nome
Completo da Computação e abra a transformação.

Essa transformação de Coluna Derivada usa uma expressão que combina


os valores das colunas e recuperadas do componente de origem e adiciona
uma nova coluna ao pipeline de fluxo de dados.FirstNameLastNameFullName

Não faça alterações na configuração do componente e clique


em Cancelar para fechar o Editor de Transformação de Coluna Derivada.

11. Abra o componente de destino Pessoas desconhecidas. Esse componente


consome os dados do pipeline de fluxo de dados e os coloca na tabela na
tabela de dados local.Application.UnknownPeopleWideWorldImporters

Não faça alterações na configuração do componente e clique


em Cancelar para fechar o Editor de Destino OLE DB.

Salve a solução.

12. Execute o pacote no modo de depuração e observe a execução do fluxo de


dados.BDC_Extract.dtsx

Deve levar cerca de um minuto para concluir ambas as operações.

13. Pare a execução e, em seguida, no SSMS ou 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 local do SQL
Server.Chapter03_OnPremises.sqlWideWorldImporters

No script T-SQL, execute a consulta que recupera dados da tabela do banco


de dados. A tabela agora deve conter 805.948
linhas.Application.UnknownPeople

14. Agora você pode fechar o SSDT.


Como funciona...
Você processou os dados em seu cluster de Big Data usando um script PySpark
para executar comandos no serviço Spark, examinar os dados e colocar os
resultados processados no armazenamento de arquivos HDFS. Por meio do uso
de uma tabela externa no banco de dados na instância do Cluster de Big Data,
você pôde consultar os dados como se estivessem armazenados em uma tabela
de banco de dados regular.

Em seguida, você concluiu o desenvolvimento de um pacote SSIS que extrai os


dados de uma tabela externa na instância do Cluster de Big Data e os carrega em
uma tabela regular no banco de dados local.

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.

Capítulo 4: Integração de dados do


Azure
Este capítulo ensinará receitas para fazer com que o SSIS interaja com os
serviços do Azure. A Microsoft criou ferramentas para permitir que o SSIS leia,
grave e chame scripts Apache Hive e Pig no Azure. Executar todas essas tarefas
a partir de um servidor ETL local do SSIS não é ideal em termos de segurança.
Você precisa abrir várias portas no servidor ETL para acessar os serviços de
nuvem. Um capítulo subsequente mostrará como chamar esses serviços de uma
ferramenta de ETL na nuvem conhecida como Azure Data Factory.
Este capítulo abrangerá as seguintes receitas:

 Configurando o Azure Feature Pack no SSIS

 Configurando um Java Runtime Environment

 Configurando uma conta de armazenamento do Azure

 Criando um cluster do Azure HDInsight sob demanda

 Transformando dados com o Hive

 Transformando dados com o Pig

Vamos começar!

Configurando o Azure Feature Pack no


SSIS
Esta receita é bastante simples em termos de mostrar como obter tarefas e
transformações do Azure. Vamos começar configurando o Azure Feature Pack no
SSIS. Isso nos permitirá interagir com contas de armazenamento do Azure e
serviços de computação do HDInsight, como Hive e Pig.

Preparando-se
Para acompanhar esta receita, você precisará do seguinte:

 Uma assinatura do Azure

 Um computador com o Visual Studio 2019 e a extensão Integration Services


instalada

Consulte o Capítulo 1, Introdução ao Azure e ao SSIS 2019, para obter etapas


detalhadas de receita se você não tiver os componentes listados aqui já
configurados.
Como fazer...
Vamos começar esta receita:

1. Em um navegador, navegue até o link a seguir e baixe o Azure Feature Pack


para SSIS. Selecione SQL Server 2019 se você instalou o Visual Studio 2019,
conforme especificado no Capítulo 1, Introdução ao Azure e SSIS
2019: https://docs.microsoft.com/en-us/sql/integration-services/azure-feature-
pack-for-integration-services-ssis?view=sql-server-ver15.
2. Baixe e instale o programa.
3. Inicie o Visual Studio e abra qualquer projeto do Integration Services. Na
caixa de ferramentas do SSIS, agora você deve ver uma seção do Azure,
juntamente com tarefas, conforme mostrado na captura de tela a seguir:

Figura 4.1 – A caixa de ferramentas do SSIS

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.

Configurando um Java Runtime


Environment
Algumas das receitas neste capítulo usam o formato de arquivo Parquet. Este é
um formato de arquivo colunar que é amplamente utilizado hoje em dia em
ambientes de nuvem. As melhorias que foram feitas no formato o torna uma
escolha incontestável, especialmente para arquivos que contêm grandes volumes
de dados. A leitura de um arquivo Parquet é muito mais rápida do que a leitura de
qualquer outro formato de arquivo. O seguinte URL contém links para o site do
Parquet, onde você pode assistir a um vídeo para obter mais informações sobre o
formato de arquivo Parquet: https://parquet.apache.org/.
Preparando-se
Devemos instalar um Java Runtime Environment (JRE) para poder usar o
formato de arquivo Parquet. Essa é a primeira coisa que faremos nesta receita.

Como fazer...
Agora, vamos começar o processo de instalação:

1. Vá para o seguinte site para fazer o download do Oracle JRE. Estamos


baixando a versão 8, que é compatível com o Microsoft Azure Feature Pack
no momento em que este artigo foi
escrito:https://www.oracle.com/java/technologies/javase/javase8-archive-
downloads.html.
2. Existem duas versões do JRE: 32 bits e 64 bits. Como o Visual Studio é um
programa de 32 bits, precisamos instalar a versão de 32 bits para desenvolver
nossos pacotes SSIS. Depois que os pacotes tiverem sido implantados no
serviço SQL Server Integration Service Catalog, precisaremos da versão de
64 bits do JRE para executar nosso pacote a partir daí.

Selecione Windows X86 (32 bits) – Java Runtime Environment 8u202,


conforme mostrado na captura de tela a seguir. Clique no link à direita para
iniciar o processo de download:

Figura 4.3 – Opção de download apropriada

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

5. Depois de baixado, clique duas vezes nele para iniciar o processo de


instalação.

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

Configurando uma conta de


armazenamento do Azure
Esta receita ensinará como configurar uma conta de armazenamento no Azure.
Uma conta de armazenamento é um recurso barato para armazenar dados que
serão usados por recursos de computação no Azure. Há dois tipos de contas de
armazenamento:

 Armazenamento de Blobs do Azure: esse é o tipo de


armazenamento básico e pode armazenar petabytes de dados por cerca de 6
centavos (USD $) por gigabyte. Existem dois tipos de blobs de
bloco: Páginas e Blobs. Os blocos de página são usados principalmente
para discos de máquina virtual. Os blocos de blob, por outro lado, são
comumente para uso multiuso.
 Azure Data Lake Gen2: esse armazenamento é muito semelhante ao
anterior, exceto que a segurança é aprimorada para fins de análise
avançada. O Azure Data Lake (ADL) Gen2 tem uma hierarquia de pastas
que não existe no armazenamento de blob regular. Isso permite a segurança
usada para ser o RBAC (controle de acesso baseado em função), o que
significa que podemos usar as credenciais do usuário atual para autenticar
em uma pasta específica na conta de armazenamento. Esse é o tipo de
armazenamento usado pela maioria dos serviços de ETL do Azure,
como Data Factory e Databricks.

Infelizmente, as tarefas e transformações do SSIS Azure Feature Pack não são


totalmente compatíveis com o ADLS Gen2. Portanto, criaremos uma versão de
blob para nosso armazenamento neste capítulo.

Preparando-se
Esta receita requer que você tenha o seguinte:

 Visual Studio 2019 com a extensão Integration Services instalada

 Azure Feature Pack instalado

 JRE instalado

 Acesso a uma assinatura do Azure

Como fazer...
Vamos começar:

1. No portal do Azure (portal.azure.com), navegue até o grupo de recursos que


criamos no Capítulo 2, Introdução ao ETL, ou seja, ETLInAzureCookBook.
Clique em +Adicionar e digite Conta de armazenamento na caixa de
pesquisa. Em seguida, clique em Criar, conforme mostrado na captura de tela
a seguir:
Figura 4.5 – Criação da conta de armazenamento

2. Preencha os campos que aparecem da seguinte forma e clique em Revisar +


criar quando terminar:

a) Assinatura: selecione sua assinatura do Azure na lista suspensa.

b) Grupo de recursos: ETLInAzureCookBook.

c) Nome da conta de armazenamento: . Uma conta de armazenamento só


pode conter letras minúsculas e números. Também deve ser único. A página
da Web a seguir fornece diretrizes para nomes de contas de
armazenamento: https://docs.microsoft.com/en-us/azure/azure-resource-
manager/management/resource-name-rules#microsoftstorage.<Your
initials>ETLInAzure

d) Localização: Selecione sua localização na lista suspensa. Você deve


selecionar a mesma região para todos os serviços que estamos criando neste
capítulo, bem como ao longo deste livro, para evitar cobranças
suplementares. No Azure, há alguns custos associados à movimentação de
dados de uma região para outra.

e) Desempenho: Utilizar o padrão; ou seja, Padrão.

f) Tipo de conta: Use o padrão; ou seja, StorageV2 (V2 de uso geral).

g) Replicação: Use o valor de replicação padrão; ou seja, armazenamento


com redundância geográfica de acesso de leitura (RA-GRS).

h) Camada de acesso (padrão): Use o valor padrão; ou seja, quente.

3. Na página Validação, clique em Revisar + Criar e, em seguida, em


Criar para criar a conta de armazenamento, conforme mostrado na captura
de tela a seguir:
Figura 4.6 – A etapa de validação da conta de armazenamento

4. Com isso, sua conta de armazenamento será criada, e você está quase


pronto para usá-la. Só nos falta um software no nosso PC: o Azure Storage
Explorer. No navegador de internet, navegue
até https://azure.microsoft.com/en-us/features/storage-explorer/#overview e
baixe a versão compatível com o sistema.
5. Uma vez baixado, instale o programa e registre sua conta. Agora você deve
ver o blob criado anteriormente, conforme mostrado na captura de tela a
seguir:
Figura 4.7 – A conta de armazenamento criada

Agora temos um blob de armazenamento configurado. Na próxima receita,


usaremos o SSIS para interagir com os serviços do Azure.

Como funciona...
Agora estamos prontos para fazer alguma codificação! É o que faremos nas
próximas receitas.

Criando um cluster do Azure HDInsight


sob demanda
Até agora, instalamos o Azure Feature Pack no SSIS e criamos uma conta de
armazenamento. Agora é hora de criar um serviço de computação no Azure para
que possamos manipular alguns dados.

Um cluster HDInsight é o que chamamos de recurso de computação no Azure. É


essencialmente um serviço Hortonworks (agora Cloudera) disponível no Azure.
Ele é composto por máquinas virtuais Linux que têm o Apache Hadoop ou o Spark
instalado nelas. O Hadoop existe há mais de uma década e foi o primeiro recurso
de computação de big data disponível. O Hadoop grava (estágios) os dados no
disco em quase todos os estágios da execução de um programa. O Spark é uma
tecnologia mais recente. Em vez de preparar dados em discos, ele usa memória
enquanto um programa é executado. É, portanto, muito mais rápido do que o
Hadoop.

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:

 Visual Studio 2019 com a extensão Integration Services instalada

 Azure Feature Pack instalado

 JRE instalado

 Acesso a uma assinatura do Azure

Como fazer...
Vamos começar:

1. Abra o Visual Studio e crie um novo projeto SSIS.


2. Renomeie o pacote como HiveSSIS.dtsx.
3. Na caixa de ferramentas SSIS, arraste e solte uma Tarefa Criar Cluster do
Azure HDInsight. Renomeie-o HDICC_etlinazure. Essa tarefa criará um
cluster chamado etlinazure. Defina as propriedades conforme mostrado na
captura de tela a seguir:
Figura 4.8 – Editor de tarefas Criar cluster do HDInsight

4. O Gerenciador de Conexões de Recursos do Azure é um pouco mais


complexo. Em um navegador da Web de sua escolha, navegue
até https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-
create-service-principal-portal para saber como obter as informações
necessárias, conforme mostrado na captura de tela a seguir: Clique
em OK quando terminar:
Figura 4.9 – Editor do Gerenciador de Conexões do Gerenciador de Recursos
do Azure

5. Renomeie o gerenciador de conexões cmgr_etlinazure_ResourceManager.


6. No menu suspenso da Conexão do Azure, selecione <nova conexão> e
preencha as caixas de informações, conforme mostrado na captura de tela a
seguir:
Figura 4.10 – A janela do Editor do Gerenciador de Conexões do Azure com
as propriedades preenchidas

7. As informações de chave da conta estão disponíveis no portal do Azure.


Navegue até sua conta de armazenamento e selecione Teclas de acesso no
painel mais à esquerda. Copie as informações
de chave1 ou chave2 mostradas e cole na caixa de texto Chave de conta da
janela Editor do Gerenciador de Conexões de Armazenamento do
Azure mostrada na Etapa 6:
Figura 4.11 – Chaves de acesso ao armazenamento do Azure

8. Não precisamos usar a Identidade Gerenciada para autenticar. Essa


configuração só pode ser usada quando o pacote é executado dentro do
Azure Data Factory. Falaremos sobre isso no Capítulo 7, Azure Data Factory.
Por enquanto, clique em Testar conexão e, em seguida, clique
em OK quando terminar.
9. Renomeie o gerenciador de conexões cmgr_etlinazureblob.
10. Selecione o grupo de recursos EtlInAzureCookBook. Escolha a mesma
região que você usou quando criou a conta de armazenamento e
use etlinazure para o nome do cluster, se ele estiver disponível. Se não
estiver, você pode usar suas iniciais para prefixá-lo ou sufixá-lo e torná-lo
exclusivo.
11. Use como o tamanho do cluster, já que nossa carga de trabalho é pequena.
Essa propriedade determina quantos trabalhadores (VMs) serão criados para
executar o script. Se tivéssemos uma carga de trabalho grande,
aumentaríamos esse número.1

A propriedade de contêiner de blob é usada para criar um contêiner em sua


conta de armazenamento que conterá várias partes de informações de
cluster, como logs, scripts e assim por diante. O contêiner será criado
automaticamente.

12. Finalmente, insira um nome de usuário e senha para administração de cluster


() e conexões SSH (). Usamos o mesmo nome de usuário aqui, mas na vida
real, eles devem diferir para fins de segurança.UserNameSshUserName
13. Deixe a propriedade definida como false. Isso nos permitirá reutilizar o cluster
se ele já tiver sido criado. Clique em OK para criar a tarefa.FailIfExists
14. Agora, clique com o botão direito do mouse na tarefa e
selecione Executar para garantir que ela funcione corretamente, conforme
mostrado na captura de tela a seguir:

Figura 4.12 – Executando a tarefa HDI

Após vários minutos (15-20), a tarefa será concluída com êxito, conforme
mostrado na captura de tela a seguir:

Figura 4.13 – A tarefa HDICC concluída com êxito

15. Abra o Gerenciador de Armazenamento do Azure e expanda a conta de


armazenamento ETLInAzureBlob. Você verá que o contêiner HDI foi criado,
conforme mostrado na captura de tela a seguir:
Figura 4.14 – O contêiner HDI criado

Como mencionei anteriormente, esse armazenamento é permanente, mesmo que


o cluster tenha sido descartado. Isso mostra exatamente como os recursos de
armazenamento e computação são desacoplados na nuvem.

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.

Transformando dados com o Hive


Agora que temos alguns dados copiados para o Azure, vamos transformá-los
usando uma linguagem de big data chamada Hive. O Hive é conhecido pela
comunidade de big data como sendo a linguagem de data warehouse na nuvem. É
essencialmente SQL, exceto que o usamos para transformar dados.

Preparando-se
Esta receita requer que você tenha o seguinte:

 Visual Studio 2019 com a extensão Integration Services instalada.

 Azure Feature Pack instalado.

 Java Runtime Engine instalado.


 Acesso a uma assinatura do Azure.

 Uma tarefa de cluster HDInsight sob demanda em seu pacote. Verifique se


você concluiu a receita Criando um cluster do Azure HDInsight sob
demanda neste capítulo.

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:

1. Na caixa de ferramentas do SSIS, arraste e solte uma tarefa de fluxo de


dados. Renomeie-o DFT_Sales.
2. Abra-o e arraste uma transformação OleDB Source para a superfície de
fluxo de dados. Nomeie-o OLEDBSRC Sales. Clique duas vezes nele para
abrir o OLE DB Source Editor. Clique em Novo ao lado da propriedade do
gerenciador de conexões e clique em Novo na janela Configurar o
Gerenciador de Conexões OLE DB. Insira as informações necessárias,
conforme mostrado na captura de tela a seguir, e clique em OK em todas as
janelas para criar o gerenciador de conexões. Renomeie-
o cmgr_ContosoRetailDW:
Figura 4.15 – Criando o gerenciador de conexões para o SQL Server

3. Clique com o botão direito do mouse em cmgr_ContosoRetailDW e converta-


o em um gerenciador de conexões de projeto para disponibilizá-lo em todos
os pacotes subsequentes que criaremos. O gerenciador de conexões deve ter
a seguinte aparência:

Figura 4.16 – O gerenciador de conexões convertido em um gerenciador de


conexões de projeto

4. Volte para o Editor de código-fonte OLE DB e verifique


se cmgr_ContonsoRetailDW está selecionado em Gerenciador de
conexões de banco de dados OLD. Na lista suspensa Modo de acesso a
dados, selecione Comando SQL. Na caixa de texto Comando SQL, digite a
consulta mostrada na captura de tela a seguir:
Figura 4.17 – Editor de código-fonte OLE DB

O texto do comando mostrado na captura de tela anterior é o seguinte:

SELECT        s.StoreName, s.ZipCode, d.FullDateLabel, f.UnitCost, f.UnitPrice,

f.SalesAmount, f.SalesQuantity, d.CalendarMonth

FROM FactSales AS f

  INNER JOIN    DimDate AS d

     ON f.DateKey = d.Datekey

   INNER JOIN DimStore AS s

     ON f.StoreKey = s.StoreKey

WHERE        (d.CalendarYear = 2009)

AND (CAST(RIGHT(d.CalendarMonth, 2) AS int) < 6)


CopyExplain
Clique em OK para fechar o editor.

5. Arraste um Destino de Arquivo Simples Flexível da seção Azure da caixa de


ferramentas SSIS. Vincule-o à fonte de vendas OLEDBSRC que acabamos
de criar. Renomeie-o FFD Sales. Clique duas vezes nele para abrir a
janela Editor de Destino de Arquivo Flexível, conforme mostrado na
captura de tela a seguir:

Figura 4.18 – Editor de destino de arquivo flexível

Deixe o valor padrão para AzureStorage como Tipo do Gerenciador de


Conexões de Arquivos. Use o gerenciador de conexões
cmgr_etlinazureblob. Para o local, use como Caminho da Pasta e
como Nome do Arquivo. Em relação ao menu suspenso Formato de
arquivo, usaremos o . Vá para a guia Mapeamento para criar o mapeamento
entre as colunas de origem e destino. Clique em OK para fechar o
editor.hivesourcesales.datParquet

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

Figura 4.19 – O arquivo .dat vendas copiado para o contêiner

8. Agora que copiamos alguns dados em nossa conta de armazenamento, é


hora de aplicar algumas transformações a eles. Volte para o fluxo de controle
e adicione uma Tarefa Hive do Azure HDInsight. Renomeie-
o AHT_SalesAgg e anexe-o ao fluxo de dados que criamos anteriormente.DFT
Sales
9. Clique duas vezes na tarefa para abrir seu editor. Defina as propriedades
mostradas na captura de tela a seguir:
Figure 4.20 – Azure HDInsight Hive Task Editor

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

11. Click Test Connection and then OK to close the window. Rename the


connection manager cmgr_AzureHdInsight once you've finished configuring
that task.
12. Set cmgr_etlinazureblob to AzureStorageConnection.
13. For LocalLogFolder, use a local path that will be used by HDInsight to store
the logs.
14. Click on the ellipsis (…) button and enter the following script:
15. DROP DATABASE IF EXISTS ETLInAzure CASCADE;

16. CREATE DATABASE ETLInAzure;

17. CREATE EXTERNAL TABLE ETLInAzure.SaleSource(

18.                                 storename string

19.                               , zipcode string

20.                               , fulldatelabel string

21.                               , unitcost decimal(12,4)

22.                               , unitprice decimal(12,4)

23.                               , salesamount decimal(12,4)

24.                               , salesquantity int

25.                               , CalendarMonth int)  

26. STORED AS PARQUET


27. LOCATION 'wasbs://hivesource@<your storage account name.blob.core.windows.net/data/';

28. CREATE EXTERNAL TABLE  ETLInAzure.SalesAgg(

29.                                 storename string

30.                               , zipcode string

31.                               , unitcost decimal(12,4)

32.                               , unitprice decimal(12,4)

33.                               , salesamount decimal(12,4)

34.                               , salesquantity int

35.                               , CalendarMonth int)

36. STORED AS PARQUET

37. LOCATION 'wasbs://hivedest@<your storage account>.blob.core.windows.net/etlinazure/';

38. INSERT OVERWRITE TABLE ETLInAzure.SalesAgg

39. SELECT storename , zipcode , SUM(unitcost) AS unitcost, AVG(unitprice) AS unitprice,

SUM(salesamount) AS salesamount, SUM(salesquantity) AS salesquantity, CalendarMonth

40. FROM etlinazure.salesource

GROUP BY storename, zipcode, CalendarMonth;


CopyExplain

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:

Figure 4.22 – The Hive Task completed with success

42. Go into Azure Storage Explorer. Open the hivedest container and navigate


to the etlinazure blob. You will see a file called 000000_0, as shown in the
following screenshot:
Figure 4.23 – The file created by Hive in Azure Storage Explorer

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:

Figure 4.24 – The file opened with Notepad

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

46. Use the cmgr_etlinazure_ResourceManager connection manager here,


which is the same one we used for the create cluster task previously in this
chapter. Set SubscriptionId to your
Azure SubscriptionId and ResourceGroup to ETLInAzureCookBook.
For ClusterName, make sure you use the cluster name we set up earlier
in this chapter. Then, click on OK to close the editor.
47. Now, right-click on the task and select Execute from the menu that appears.
Once the execution is completed – which might take a few minutes – you
should see that the task completed with success.

Important note

It is very important to drop resources once we do not need them anymore.


Since we're renting these resources, we are paying for them and they can
become very expensive if we don't drop them when they are not being used.
That's exactly what we'll do in the last step of this recipe.

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:

Figure 4.26 – Execute SQL Task editor

49. Set ConnectionType to OLE DB and use


the cmgr_ContonsoDW connection manager to connect to
the ContonsoDW database on our local machine.
50. The SQLStatement property is very simple:
TRUNCATE TABLE SalesAgg;
CopyExplain

Click on OK to close the editor.

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:

Figure 4.27 – Foreach Loop Editor

53. Click on the list beside the Enumerator property and select Foreach Azure


Blob Enumerator. Use the cmgr_etlinazureblob connection manager. For
the location information, type into the Blob container name textbox. Finally,
type into the Blob directory textbox. hivedestetlinazure/
54. Select Variable Mappings from the leftmost list box. Click on the drop-down
list under Variable Column and select <New Variable>. The Add
Variable window will appear.
55. Name the variable Filename. This will contain the name of the file that we're
going to read from Azure. Click on OK to close the Add Variable window
and OK again to close the Foreach Loop Editor window.
56. Drag and drop a dataflow task into the FELC HiveDest container. Rename
it DFT SalesAgg.
57. Double-click on it to go inside it.
58. From the SSIS toolbox, drag and drop a Flexible File Source, name it , and
double-click on it to open its editor. Set the properties like so:FFS_SalesAgg

a) File Connection Manager Type: AzureStorage

b) Select cmgr_etlinazureblob as the connection manager.

c) Type hivedest/ into the Location property's Folder Path textbox.

d) Type 000000_0 into the File Name textbox. Later, we will ensure that the


filename is set dynamically via an expression.

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

Click on OK to close the editor.

60. Now, in a production environment, we want to know the execution ID that


inserted rows into our destination table. For that, we will use a SSIS system
variable called ServerExecutionID. We will add it to our dataflow. Drag
a Derived Column transform onto the dataflow, rename it DER
ServerExecutionID, and attach it to the Flexible File Source component we
created in Step 32. Double-click on it to open its editor. Set
the ServerExecutionID column (from the system variables), as shown in the
following screenshot:
Figure 4.29 –Derived Column Transformation Editor

Click on OK to close the Derived Column Transformation Editor window.

61. Finally, drag and drop an OLE DB Destination onto the dataflow. Name


it OLEDBDSTSalesAgg and attach it to the DER
ServerExecutionID derived column transform we created previously.
62. Double-click on it to open its editor. Set OLE DB Connection
Manager to cmgr_ContonsoRetailDW. Click on the New button
beside Name of the Table or View. A Create Table window will appear.
Remove the OLEDBDST prefix and ensure that there is no whitespace left.
Click on OK to create the table.
63. Click on the Mappings item in the leftmost list box to confirm the mappings
between the source and destination columns. Your screen should look as
follows:
Figure 4.30 – The mappings editor in the OLE DB Destination Editor window

Click on OK to close the 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

67. The Property Expression Editor will appear. Select the [FFS_SalesAgg]


[FileName] property in the left pane of the editor. In the expression, click the
ellipsis button (…) and select the Filename variable. Click on OK in both
the Expression Builder and Property Expression editor windows.
68. Now, when we run the package, the filename will be set by our Foreach loop
container dynamically. But there is still a caveat. If the file does not exist in
the blob storage, the package will not be validated when we execute it. To
circumvent this issue, once again, click anywhere in an empty space of the
dataflow and go the Properties window to the right.
69. Set the DelayValidation property to True, as shown in the following
screenshot. This means that the package will not try to validate the dataflow
when it opens. The dataflow will be validated only when it is executed:

Figure 4.32 – The DelayValidation setting set to True

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

Let's move on to the next section!

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.

Finally, it aggregates the data, removing the fulldatelable column and summing


the data by storename, zipcode, and CalendarMonth.

Esta foi uma receita bastante complexa. Criamos, usamos e descartamos um


recurso de computação do Azure HDInsight para transformar nossos dados e, em
seguida, usamos a linguagem do Hive para agregar esses dados. A próxima
seção será muito semelhante a esta, exceto que usaremos Pig em vez de Hive.

Transformando dados com o Pig


Esta seção é quase idêntica à anterior. A única diferença é que vamos usar o Pig
para fazer as transformações e usar diferentes recipientes em nosso
armazenamento.

Pig é uma linguagem de script que pode comer qualquer coisa. Isso significa que


podemos consumir quase qualquer tipo de arquivo facilmente com o Pig. No
entanto, há uma restrição sobre os tipos de arquivo que podemos usar com a
versão HDInsight do Pig: O arquivo Parquet não pode ser usado. Isso ocorre
porque uma biblioteca está ausente no cluster HDInsight pronto para uso. Por esta
razão, usaremos um formato de arquivo de texto normal nesta receita.

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:

 Visual Studio 2019 com a extensão Integration Services instalada

 Azure Feature Pack instalado

 Java Runtime Engine instalado

 Acesso a uma assinatura do Azure

 Uma tarefa de cluster HDInsight sob demanda em seu pacote

Certifique-se de ter concluído a receita Criando um cluster do Azure HDInsight sob


demanda antes de iniciar este.

Como fazer...
Agora que temos alguns dados copiados para o Azure, vamos transformá-los
usando o Apache Pig.

Algumas das etapas dessa receita foram explicadas na receita Transformando


dados com o Hive quando copiamos dados para uma conta de armazenamento do
Azure. O que difere aqui é o destino do Arquivo Simples Flexível.

Começaremos copiando alguns dados em um contêiner em nossa conta de


armazenamento:

1. Na janela Gerenciador de Soluções, vá para a pasta Pacotes SSIS, clique


com o botão direito do mouse nela e selecione Novo pacote SSIS no menu
exibido. Renomeie-o e pressione Enter. PigSSIS.dtsx
2. Na caixa de ferramentas do SSIS, arraste e solte uma tarefa de fluxo de
dados. Renomeie-o como DFT Sales.
3. Abra-o e arraste uma transformação OleDB Source para a superfície de
fluxo de dados. Nomeie-o OLEDBSRC Sales. Clique duas vezes nele para
abrir a janela OLE DB Source Editor. Clique em Novo ao lado da
propriedade do gerenciador de conexões e clique em Novo na
janela Configurar o Gerenciador de Conexões OLE DB. Insira as
informações necessárias, conforme mostrado na captura de tela a seguir, e
clique em OK em todas as janelas para criar o gerenciador de conexões.
Renomeie-o cmgr_ContosoRetailDW.
4. Clique com o botão direito do mouse em cmgr_ContosoRetailDW e converta-
o em um gerenciador de conexões de projeto para disponibilizá-lo em todos
os pacotes subsequentes que criaremos. O gerenciador de conexões deve ter
a seguinte aparência:

Figura 4.36 – O gerenciador de conexões

5. Volte para a janela Editor de código-fonte OLE DB e verifique


se cmgr_ContonsoRetailDW está selecionado como gerenciador de
conexões de banco de dados OLD. No modo de acesso a dados,
selecione Comando SQL. Adicione o seguinte texto de comando SQL:
6. SELECT        s.StoreName, s.ZipCode, d.FullDateLabel, f.UnitCost, f.UnitPrice,

f.SalesAmount, f.SalesQuantity, d.CalendarMonth

7. FROM FactSales AS f

8.    INNER JOIN DimDate AS d

9.      ON f.DateKey = d.Datekey

10.    INNER JOIN DimStore AS s

11.      ON f.StoreKey = s.StoreKey

12. WHERE        (d.CalendarYear = 2009)

AND (CAST(RIGHT(d.CalendarMonth, 2) AS int) < 6)


CopyExplain

Clique em OK para fechar o editor.

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

Figura 4.37 – A coluna derivada de substituição NULL

14. Na seção Coluna Derivada, selecione Substituir 'CEP'. Digite como a


expressão. Clique em OK para fechar o editor.REPLACENULL(ZipCode, "N/A")
15. Arraste um Destino de Arquivo Simples Flexível da seção Azure da caixa
de ferramentas SSIS. Vincule-o à fonte de vendas OLEDBSRC que
acabamos de criar. Renomeie-o FFD Sales. Clique duas vezes nele para
abrir a janela Editor de Destino de Arquivo Flexível, conforme mostrado na
captura de tela a seguir:
Figura 4.38 – Editor de destino de arquivo flexível

16. Deixe o AzureStorage como tipo de gerenciador de conexões de arquivo.


Use o gerenciador de conexões cmgr_etlinazureblob aqui. Para o local,
use pigsource/data como Caminho da pasta e vendas.dat como Nome do
arquivo. O Pig não suporta o formato Parquet sem bibliotecas suplementares
sendo instaladas, portanto, para File Format, usaremos Text, com uma barra
vertical (|) como delimitador. Clique na guia Mapeamentos para manter o
mapeamento de coluna. Em seguida, clique em OK para fechar o editor.
17. Volte para a seção Fluxo de Controle do pacote. Clique com o botão direito
do mouse na tarefa e selecione Executar no menu exibido.
18. Depois de concluído, vá para o Gerenciador de Armazenamento do
Azure e expanda o contêiner pigsource. Clique na pasta chamada dados.
Você deve ver o arquivo sales.dat aparecer, conforme mostrado na captura
de tela a seguir:
Figura 4.39 – O arquivo .dat venda copiado para o contêiner de
armazenamento

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.

19. Abra o Gerenciador de Armazenamento do Azure e crie um contêiner


chamado pigdest, conforme mostrado na captura de tela a seguir:

Figura 4.40 – A bolha do pigdest

20. Volte para o Visual Studio e o fluxo de controle de pacote e adicione


uma Tarefa Pig do Azure HDInsight. Renomeie-o APT_SalesAgg e anexe-o
ao fluxo de dados DFT Sales que criamos anteriormente.
21. Clique duas vezes na tarefa para abrir seu editor e definir suas propriedades,
conforme mostrado na captura de tela a seguir:
Figura 4.41 – Editor de tarefas do Pig do Azure HDInsight

Ponta

Essa etapa foi explicada na receita Transformando dados com o Hive.

22. Na receita Transformando dados com o Hive, criamos um cluster HDInsight


sob demanda. Ele foi excluído no final do pacote, o que significa que
precisamos recriá-lo. Vamos criar um gerenciador de conexões para interagir
com ele. Na lista suspensa próxima à propriedade HDInsightConnection,
selecione <Nova Conexão>. Uma janela do Editor do Gerenciador de
Conexões do Azure HDInsight será exibida. Preencha as propriedades
necessárias, conforme mostrado na captura de tela a seguir:
Figura 4.42 – Editor do Gerenciador de Conexões do Azure HDInsight

23. Clique em Testar conexão e, em seguida, OK para fechar a janela.


Renomeie o cmgr_AzureHdInsight do gerenciador de conexões assim que
terminar de configurar essa tarefa.
24. Defina cmgr_etlinazureblob como AzureStorageConnection.
25. Para LocalLogFolder, use um caminho local que será usado pelo HDInsight
para armazenar os logs.
26. Na seção Script 4-In-line, clique nas três reticências (...) e copie e cole o
seguinte script:
27. /* Read data from blob storage */;

28. RawSales = LOAD 'wasbs://pigsource@etlinazureblob.blob.core.windows.net/data/' USING

PigStorage('|') AS (StoreName:chararray, ZipCode:chararray, FullDateLabel:chararray,

UnitCost:double, UnitPrice:double, SalesAmount:double, SalesQuantity:int,

CalendarMonth:long);

29. /* Remove header line */;

30. Sales = Filter RawSales by (StoreName != 'StoreName');

31. /* Group by dimensinal attributes */;

32. Sales_Group = Group Sales by (StoreName, ZipCode, CalendarMonth);

33. /* Aggregate the data */;


34. AggSales = foreach Sales_Group generate FLATTEN((group)),

FLATTEN(( SUM(Sales.UnitCost), AVG(Sales.UnitPrice), SUM(Sales.SalesAmount),

SUM(Sales.SalesQuantity)));

35. /* Cleanup output directory */;

36. rmf wasbs://pigdest@<Your Storage account>.blob.core.windows.net/etlinazure;

37. /* Store the result into a file */;

STORE AggSales INTO 'wasbs://pigdest@etlinazureblob.blob.core.windows.net/etlinazure'

USING PigStorage('|');
CopyExplain

Deixe as outras propriedades vazias e clique em OK para fechar o editor de


tarefas.

38. Clique com o botão direito do mouse na tarefa e execute-a. Após 1 ou 2


minutos, a tarefa será concluída com êxito, conforme mostrado na captura de
tela a seguir:

Figura 4.43 – A tarefa Pig concluída com sucesso

39. Agora, vá para o Gerenciador de Armazenamento do Azure. Abra o


contêiner pigdest e navegue até o blob etlinazure. Você verá um arquivo
chamado 000000_0, conforme mostrado na captura de tela a seguir:

Figura 4.44 – O conteúdo do blob etlinazure


Deve haver um arquivo aqui chamado _SUCCESS. Teremos que nos livrar
dele quando precisarmos ler os arquivos no contêiner.

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:

Figura 4.45 – O conteúdo do arquivo no bloco de notas

Feche o editor de texto. A próxima receita mostrará como ler o arquivo.


42. Agora que transformamos nossos dados em nosso cluster HDInsight, não
precisamos mais deles. Arraste e solte uma Tarefa de Exclusão de Cluster
do Azure HDInsight da caixa de ferramentas SSIS. Renomeie-o HDIDC
etlinazure e anexe-o à tarefa anterior no fluxo de controle do pacote.
43. Clique duas vezes na tarefa para abrir seu editor e definir suas propriedades,
conforme mostrado na captura de tela a seguir:

Figura 4.46 – Editor de tarefas de exclusão de cluster do Azure HDInsight

44. Use o gerenciador de conexões cmgr_etlinazure_ResourceManager aqui,


que é o mesmo que usamos anteriormente neste
capítulo. Defina SubscriptionId para seu Azure
SubscriptionId e ResourceGroup como ETLInAzureCookBook.
Para ClusterName, certifique-se de usar o nome do cluster configurado
anteriormente neste capítulo. Clique em OK para fechar o editor.
45. Agora, clique com o botão direito do mouse na tarefa e selecione Executar no
menu que aparece. Uma vez concluída a execução – o que pode levar alguns
minutos – você deve ver que a tarefa foi concluída com sucesso, conforme
mostrado na captura de tela a seguir:
Figura 4.47 – A tarefa concluída com êxito

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

46. Na caixa de ferramentas SSIS, arraste e solte uma Tarefa Executar


SQL no fluxo de controle. Renomeie-o SQL Trucate SalesAgg.
Essencialmente, essa tarefa será usada para esvaziar uma tabela
chamada SalesAgg. Vamos criar esta tabela mais adiante nesta receita.
Vincular a tarefa à anterior; Isto é. Clique duas vezes na tarefa para abrir o
editor e definir as propriedades necessárias, conforme mostrado na captura
de tela a seguir:HDIDC etlinazure
Figura 4.48 – Executar Editor de Tarefas SQL

Defina ConnectionType como OLE DB e use o gerenciador de conexões


cmgr_ContonsoDW para se conectar ao banco de dados ContonsoDW em
nossa máquina local.

O código necessário para SQLStatement é muito simples:

TRUNCATE TABLE SalesAgg;


CopyExplain

Clique em OK para fechar o editor. Se você executar a tarefa agora, ela


falhará porque ainda não criamos a tabela. Vou fazer isso mais tarde nesta
receita.
47. Arraste e solte um contêiner Foreach Loop no fluxo de controle. Renomeie-
o FELC PigDest. Anexe-o à tabela SQL Trucate SalesAgg que criamos
anteriormente nesta receita.
48. Clique duas vezes nele para abrir seu editor. Defina suas propriedades,
conforme mostrado na captura de tela a seguir:

Figura 4.49 – Editor de loop Foreach

Clique na lista ao lado da propriedade Enumerator e selecione Foreach


Azure Blob Enumerator. Use o gerenciador de conexões
cmgr_etlinazureblob aqui. Em Local, digite na caixa de texto Nome do
contêiner de Blob. Finalmente, digite na caixa de texto Diretório de
Blob.pigdestetlinazure/

49. Selecione Mapeamentos de variáveis na caixa de listagem mais à esquerda.


Clique na lista suspensa na coluna Variável e selecione <Nova variável>. A
janela Adicionar variável será exibida, conforme mostrado na captura de tela
a seguir:

Figura 4.50 – A janela Adicionar variável

50. Nomeie a variável Filename. Em seguida, clique em OK para fechar a


janela Adicionar variável e OK novamente para fechar a janela Foreach
Loop Editor.
51. Com Pig, há duas coisas que devemos estar atentos. Primeiro, não tente
carregar o arquivo _SUCCESS e remova o prefixo no nome do arquivo. Para
fazer isso corretamente, usaremos uma Tarefa de Expressão. Arraste e solte
uma Tarefa de Expressão na superfície de fluxo de controle. Renomeie-o e
clique duas vezes nele para abrir seu editor.etlinazure/EXPR Filename
52. Digite a seguinte expressão na caixa Expressão e clique em OK para fechar
a janela do Construtor de Expressões:

@[User::Filename] = REPLACE( @[User::Filename], "etlinazure/", "")

Isso pode ser visto na seguinte captura de tela:


Figura 4.51 – Construtor de expressões

53. Arraste e solte uma tarefa de fluxo de dados no contêiner. Renomeie-o e


anexe-o ao nome do arquivo que criamos anteriormente.FELC PigDestDFT
SalesAggEXPR
54. Para garantir que não carregamos o arquivo criado pelo Pig, clique duas
vezes no caminho; ou seja, a seta entre a tarefa de expressão e a tarefa de
fluxo de dados. Isso abrirá a janela Editor de Restrição de Precedência.
Estamos usando isso para ignorar o arquivo. Conforme mostrado na captura
de tela a seguir, altere a operação Avaliação para Expressão e Restrição
e insira na caixa Expressão:_SUCCESS_SUCCESS@[User::Filename] != "_SUCCESS"
Figura 4.52 – A janela Editor de Restrição de Precedência preenchida

55. Clique em OK para fechar o editor.


56. Clique duas vezes no fluxo de dados (DFT SalesAgg) para entrar nele.
57. Na caixa de ferramentas SSIS, arraste e solte uma fonte de arquivo flexível,
renomeie-a FF_SalesAgg e clique duas vezes nela para abrir seu editor.
Defina suas propriedades assim:

a) Conexão de arquivos: AzureStorage.

b) Use cmgr_etlinazureblob como gerenciador de conexões.

c) Digite na caixa de texto Caminho da pasta da


propriedade Location. pigdest/etlinazure

d) Para a propriedade Nome do Arquivo, digite . Mais tarde, garantiremos


que o nome do arquivo seja definido dinamicamente por meio de uma
expressão. part-v001-o000-r-00000

e) Defina Text como a propriedade File Format.

f) Use um tubo (|) como caractere delimitador de coluna.


58. Em seguida, clique no item Colunas na caixa de listagem mais à esquerda.
Ao contrário do formato Parquet, precisamos renomear as colunas, já que o
Pig não tem nenhum conceito de nomes de colunas e todos eles são
nomeados , e assim por diante. Depois de renomear as colunas, o resultado
final deve ter a seguinte aparência:Prop1Prop2

Figura 4.53 – O editor de colunas na janela Editor de código-fonte de arquivo


flexível

59. Clique em OK para fechar o editor.


60. Agora, queremos saber a ID de execução que inseriu linhas em nossa tabela
de destino. Faremos isso em um ambiente de produção. Para isso,
usaremos uma variável de sistema SSIS chamada ServerExecutionID.
Vamos adicioná-lo ao nosso fluxo de dados. Arraste uma transformação de
Coluna Derivada para o fluxo de dados, renomeie-a como DER
ServerExecutionID e anexe-a ao componente Fonte de Arquivo
Flexível que criamos anteriormente. Clique duas vezes nele para abrir seu
editor. Defina a coluna das variáveis do sistema, conforme mostrado na
captura de tela a seguir:ServerExecutionID
Gráfico 4. 54 – Editor de transformação de coluna derivada

Clique em OK para fechar a janela Editor de Transformação de Coluna


Derivada.

61. Finalmente, arraste e solte um destino OLE DB no fluxo de dados. Nomeie-


o OLEDBDST SalesAgg e anexe-o à transformação de coluna
derivada ServerExecutionID do DER que criamos anteriormente.

Ponta

Fizemos essa etapa na receita Transformando dados com o Hive.

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

63. Clique em OK para criar a tabela.


64. Clique no item Mapeamentos na caixa de listagem mais à esquerda para
confirmar os mapeamentos entre as colunas de origem e destino. Sua tela
deve ter a seguinte aparência:
Figura 4.56 – A guia Mapeamentos da janela Editor de Destino OLE DB

Clique em OK para fechar o editor.

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

68. A janela Editor de Expressão de Propriedade será exibida. Selecione a


propriedade [FFS_SalesAgg][FileName] no painel esquerdo do editor. Na
caixa Expressão, clique no botão de reticências (...) e selecione a
variável Nome do arquivo, conforme mostrado na captura de tela a seguir:

Figura 4.58 – Construtor de expressões

Clique em OK nas janelas do Construtor de Expressões e do Editor de


Expressões de Propriedades.

Agora, quando executarmos o pacote, o nome do arquivo será definido pelo


contêiner de loop Foreach dinamicamente. Mas ainda há uma ressalva. Se o
arquivo ainda não existir no armazenamento de blob, o pacote não será
validado quando o executarmos.

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:

Figura 4.59 – A propriedade DelayValidation

Agora, volte ao fluxo de controle. Seu pacote deve ter a seguinte aparência:
Figura 4.60 – O fluxo de controle completo

71. Agora, podemos executar o pacote. Levará vários minutos para ser


executado, já que estamos criando e descartando um cluster HDInsight
dentro dele.
72. Depois que a execução for concluída, vá para o SQL Server Management
Studio e selecione a linha da tabela, conforme mostrado na captura de tela a
seguir:

Figura 4.61 – A consulta executada no SSMS

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.

O roteiro do Porco nos permitiu fazer o seguinte nesta receita:

Primeiro, criamos uma variável chamada RawSales e carregamos o conteúdo do


arquivo que criamos anteriormente nele. Removemos a linha de cabeçalho, pois
isso só estará em nosso caminho quando transformarmos e agruparmos os dados
com a variável Sales_Group usando StoreName, ZipCode e CalendarMonth.
Em seguida, agregamos os dados em uma variável chamada AggSales. Como
isso cria tuplas no Pig, nós as achatamos para obter um resultado consumível com
a função. O Pig não pode substituir o arquivo de destino. Usamos o comando para
apagar o diretório de destino. Finalmente, escrevemos a tabela SalesAgg em um
arquivo que será armazenado no blob. FLATTENrmfeltinazure

Capítulo 5: Estendendo o SSIS com


tarefas e transformações personalizadas
Neste capítulo, você aprenderá como estender a coleção de tarefas de fluxo de
controle SSIS fornecidas nativamente e componentes de fluxo de dados criando
uma tarefa de fluxo de controle personalizada e um componente de fluxo de dados
personalizado. Aproveitando a extensibilidade interna do SQL Server 2019
Integration Services (SSIS), você pode implementar suas próprias soluções, ou
módulos, a serem usados em fluxos de controle SSIS ou fluxos de dados. Além
disso, você pode implementá-los de uma forma que os torne virtualmente
indistinguíveis dos fornecidos nativamente.

Este capítulo aborda as seguintes receitas, destinadas a introduzir a


personalização do SSIS:

 Projetando uma tarefa de fluxo de controle personalizada

 Projetando um componente de fluxo de dados personalizado

 Implantando personalizações do SSIS

 Atualizando um componente de fluxo de dados personalizado

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.

Projetando uma tarefa de fluxo de


controle personalizada
Para determinar se, em uma determinada situação, você realmente precisa de
personalização ou não, você precisa se fazer duas perguntas:

 A operação necessária pode ser executada usando uma ou mais tarefas ou


componentes fornecidos nativamente de forma eficiente que permanecerá
escalável e não comprometerá a manutenibilidade da solução?

 A operação dada só seria necessária nesta situação específica, ou é razoável


esperar que uma operação semelhante possa ser necessária em outro lugar,
ou em um momento posterior?

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.

Normalmente, você usaria scripts se a lógica personalizada for necessária em um


único pacote, ou – se eventualmente encontrar sua base em pacotes adicionais –
quando o ciclo de vida (por exemplo, correções de bugs, atualizações ou ajustes)
dessas instâncias separadas puder permanecer mutuamente independente
(idealmente, se alterações posteriores implementadas em uma cópia não
precisarem ser propagadas para outras cópias).

Se a reutilização for necessária, ou puder ser razoavelmente esperada,


a personalização por meio do uso de tarefas personalizadas ou componentes
personalizados deve ser preferida em relação ao script. Isso também permite que
os recursos personalizados sejam desenvolvidos, implantados e mantidos
independentemente dos pacotes SSIS nos quais estão sendo usados.

Esta receita irá guiá-lo através do desenvolvimento de uma tarefa personalizada


bastante simples, mas bastante útil. Um dos problemas que um administrador de
banco de dados tem que enfrentar diariamente é o monitoramento do uso de
recursos. Saber quais processos utilizam quais recursos em diferentes momentos
do dia é crucial para uma operação eficiente e planejamento de capacidade. Por
exemplo, o SQL Server oferece suporte à propriedade Nome do Aplicativo, que
os aplicativos cliente podem usar para se identificar nos logs de atividade do SQL
Server. A propriedade pode ser enviada para o servidor dentro da cadeia de
conexão ao estabelecer a conexão e é acessível a uma variedade de recursos
internos de monitoramento.

Normalmente, depois que uma solução SSIS é implantada no ambiente de


destino, o administrador desse ambiente tem controle total das configurações
usadas por essas soluções. Por exemplo, para poder distinguir entre conexões
diferentes, o administrador pode adicionar nomes de pacotes a cadeias de
conexão usadas por pacotes diferentes. Por outro lado, os nomes dos pacotes
podem mudar com o tempo, a mesma cadeia de conexão pode ser usada em mais
de um pacote e assim por diante.

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.

Você não precisa executar nenhuma tarefa associada ao Azure no momento.

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:

Figura 5.1 – Criando um novo projeto de Biblioteca de Classes

3. Na caixa de diálogo Configurar seu novo projeto, use as seguintes


configurações:

a) Nome do projeto: ApplicationName

b) Nome da solução: SSISCustomization

Você pode usar o local padrão para a solução.


Deixe a opção Colocar solução e projeto na mesma pasta desmarcada
e deixe a versão padrão da estrutura selecionada – ela deve ser a versão
mais recente.

Quando estiver pronto, clique em Criar para continuar. Deverá demorar


apenas um momento para que a nova solução sejacriada.

4. No Gerenciador de Soluções, localize o arquivo que foi criado por padrão e


altere seu nome para .Class1.csApplicationNameTask.cs

Quando solicitado pelo Visual Studio se você também gostaria de alterar


todas as referências à classe, clique em Sim para confirmar a renomeação:

Figura 5.2 – Renomeando o arquivo que contém o código-fonte da classe e a


própria classe

Salve o solution.

5. No Gerenciador de Soluções, clique com o botão direito do mouse no nó


do projeto e selecione Propriedades no menu de atalho.

Na página Aplicativo das propriedades do projeto, altere a configuração de


namespace Padrão para EtlWithAzure, conforme mostrado na captura de
tela a seguir:
Figura 5.3 – Definindo o namespace padrão do projeto

Salve o projeto.

6. Na página Compilar, verifique se Release é a configuração selecionada e, na


seção Saída, ao lado da configuração Caminho de saída, clique
em Procurar... para abrir a caixa de diálogo Selecionar caminho de saída:
Figura 5.4 – Definindo o caminho de saída da versão

Navegue até a pasta e clique em Selecionar Pasta para confirmar a


seleção.C:\ETL-with-Azure\Chapter05\Files

A configuração Caminho de saída agora deve conter o caminho para a


pasta.C:\ETL-with-Azure\Chapter05\Files\

Salve o project.

7. Na página Assinatura, marque Assinar o assembly e


selecione <Procurar... > na caixa de listagem Escolher um arquivo de
chave de nome forte para abrir a caixa de diálogo Selecionar arquivo.
Navegue até a pasta, selecione o arquivo e clique em Abrir para confirmar a
seleção:C:\ETL-with-Azure\Chapter05\FilesEtlWithAzure.snk

Figura 5.5 – Assinatura do contrato

Salve o projeto e feche a guia de propriedades do projeto.

Ponta

Você pode saber mais sobre assemblies de nome forte e assinatura de


assembly no artigo intitulado Assemblies de nome
forte no https://docs.microsoft.com/en-us/dotnet/standard/assembly/strong-
named.

8. Na definição ApplicationNameTask.cs altere o namespace da classe


para EtlWithAzure.

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

A captura de tela a seguir mostra as referências selecionadas:

Figura 5.6 – Adicionando referências de assembly

Quando estiver pronto, clique em OK para confirmar a seleção.

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

Esse arquivo contém todo o código-fonte necessário para projetar a tarefa


personalizada. Use-o para copiar e colar as definições no arquivo de classe,
em vez de digitá-las. Além disso, observe que nem todo o código-fonte
necessário está listado nesta receita, mas está disponível no arquivo de
texto.C#

12. No Visual Studio, no arquivo, substitua as referências existentes na parte


superior da definição com as seguintes:ApplicationNameTask.cs
13. using Microsoft.SqlServer.Dts.Runtime;

14. using System;

15. using System.Collections.Generic;

using System.Data.Common;
CopyExplain

A referência ao namespace contém a classe


base.Microsoft.SqlServer.Dts.RuntimeTask

16. Modifique a definição de classe para que ela derive a classe


base:ApplicationNameTaskTask
public class ApplicationNameTask : Task
CopyExplain
17. Implemente colocando sua definição logo antes da definição de
classe:DtsTaskAttribute
18. [DtsTaskAttribute(

19.     Description = "Assign SSIS Package Name as Application Name to Connection Strings.",

20.     DisplayName = "Application Name",

21.     TaskType = "Application Name Task",


22.     RequiredProductLevel = DTSProductLevel.None

23.     )]

public class ApplicationNameTask : Task


CopyExplain
24. Copie e cole os seguintes itens do arquivo de texto na definição de classe
(cada grupo é marcado com uma linha de comentário correspondente):

a) Constantes privadas – todos os valores fixos utilizados pela classe são


colocados aqui por conveniência.

b) Variáveis privadas – todas as variáveis utilizadas no nível de classe


também são definidas aqui.

c) Membros públicos – propriedades configuráveis são expostas como


membros públicos .

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

Conclua a definição do método copiando e colando o código-fonte


correspondente do arquivo de texto:

this.ApplicationName = String.Empty;

this.IsVerbose = true;

this.ResolveSystemVariables(ref variableDispenser);

base.InitializeTask(connections, variableDispenser, events, log, eventInfos, logEntryInfos,

refTracker);
CopyExplain

Esses comandos serão executados em tempo de design quando a tarefa for


colocada no fluxo de controle e inicializarão a tarefa – ou seja, definindo os
valores padrão de ambos os membros públicos, expostos ao IDE como
propriedades personalizadas da tarefa.
26. Use a mesma abordagem usada na Etapa 16 para substituir o método e
adicione o código-fonte correspondente do arquivo de texto:Validate
27. if (String.IsNullOrEmpty(_defaultApplicationName))

28. {

29.     componentEvents.FireError(0, _taskName,

30.     UNRESOLVED_APPLICATION_NAME_MESSAGE,

31.     String.Empty, 0);

32.     return DTSExecResult.Failure;

33. }

return DTSExecResult.Success;
CopyExplain

Esses comandos serão executados em tempo de design, quando a


configuração da tarefa for confirmada, e em tempo de execução durante a
validação do pacote e da tarefa.

34. Em seguida, substitua o método. Nesse caso, a definição também é


encerrada em um bloco. Ele está localizado no arquivo, abaixo do
comentário.Executetry…catchChapter05_ApplicationNameTask.txtOverride
Execute, and supply the following definition
35. Abaixo do método, cole as definições completas dos seguintes métodos
privados do arquivo de texto:Execute

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.

A biblioteca deve ser construída sem erros; No entanto, se ocorrerem erros,


revise as mensagens de erro, faça as correções necessárias e tente
novamente.

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:

Figura 5.7 – Compilando a versão Release do assembly


Crie a solução pressionando Ctrl + Shift + B no teclado ou selecionando
Build Solution no menu Build.

Após uma compilação de versão bem-sucedida, a biblioteca compilada deve estar


disponível na pasta. Para que a tarefa personalizada esteja disponível no SSDT e
para o tempo de execução do SSIS, os arquivos também devem ser copiados
para os locais corretos e registrados no GAC (Global Assembly Cache), o que
você fará na terceira receita, Implantando personalizações do SSIS, neste
capítulo.C:\ETL-with-Azure\Chapter05\Files

Você pode deixar o Visual Studio aberto.

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.

Em tempo de execução, o método é chamado pelo mecanismo de execução do


SSIS. O loop principal desse método percorre a coleção de gerenciadores de
conexões disponíveis para o pacote, verifica se eles são compatíveis com as
funções subjacentes e altera suas cadeias de conexão para que elas também
contenham o nome do pacote como o nome do aplicativo.Executeforeach

As tarefas individuais são executadas pelos seguintes métodos privados:

 ResolveSystemVariables: O método recupera os valores das variáveis do


sistema e os atribui a variáveis locais para uso posterior.
 GetApplicationName: O método determina o nome do aplicativo a ser usado
nas cadeias de conexão. Por padrão, o nome do pacote SSIS é usado, mas
o autor do pacote SSIS também pode fornecer um valor diferente por meio da
propriedade da tarefa. Por exemplo, um valor literal determinado em tempo de
design pode ser usado ou o valor pode ser atribuído por meio de uma
expressão em tempo de execução.ApplicationName
 GetConnectionManagerType: O método identifica o tipo do gerenciador de
conexões; Há suporte para ADO.NET, gerenciadores de conexões OLE DB e
ODBC.
 GetEnhancedConnectionString: O método altera a cadeia de conexão usada por
um gerenciador de conexões com suporte.
 FireInformation: O método é uma simplificação do método interno usado para
emitir mensagens informativas registradas no log de atividades do SSIS.

Quando o valor da propriedade da tarefa é , a tarefa relata todos os detalhes de


seu progresso para o log de atividades do SSIS. Se o valor for , a tarefa relatará
apenas as ações padrão.IsVerbosetruefalse

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.

Ao colocar a tarefa no início do fluxo de controle do pacote, você pode garantir


que o nome correto do aplicativo seja relatado ao(s) servidor(es) de destino assim
que o pacote começar a ser executado.

Projetando um componente de fluxo de


dados personalizado
Esta receita demonstra o design de uma transformação de fluxo de dados
personalizados. O uso eficiente de recursos representa um dos principais objetivos
no desenvolvimento de ETL. Ser capaz de determinar quais dados extraídos da
origem realmente precisam ser carregados no destino é provavelmente o recurso
mais importante de qualquer solução de ETL. Determinar se uma linha de entrada
contém dados diferentes da linha existente correspondente pode ser executado
comparando cada coluna de origem com a coluna de destino correspondente. Tais
comparações podem ser dispendiosas, pois exigem que todos os dados
relevantes sejam carregados da tabela de destino para realizar a comparação.

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

O algoritmo usado nesta receita pode não representar o máximo em recursos de


hash do .NET, mas deve ser bom o suficiente para esta demonstração.

Você criará uma transformação personalizada que recuperará os valores de uma


ou mais colunas de cada linha de pipeline, criará um único valor composto e o
usará para calcular um único valor de hash, que será colocado no pipeline em
uma nova coluna. A transformação oferecerá suporte a qualquer número de
colunas de todos os tipos de dados de pipeline do SSIS com suporte,
especificados pelo autor do pacote SSIS em tempo de design.

Para criar um componente de fluxo de dados 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
precisa fornecer a lógica que permitirá que os autores de pacotes SSIS
configurem corretamente o componente personalizado em tempo de
design.PipelineComponentMicrosoft.SqlServer.Dts.PipelineMicrosoft.SqlServer.Pipe
lineHost.dll

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:

1. No Gerenciador de Soluções, clique com o botão direito do mouse no


nó Solução e selecione Adicionar | Novo Projeto... no menu de atalho ou
selecione Adicionar | Novo Projeto... no menu Arquivo enquanto o
nó Solução estiver selecionado, para adicionar um novo projeto à solução
existente.

Selecione o modelo, conforme mostrado na Figura 5.1 na receita Criando


uma tarefa de fluxo de controle personalizado.Class Library (.NET Framework)

Quando estiver pronto, clique em Avançar para continuar.

2. Na página Configurar seu novo projeto, digite como o nome do projeto e


deixe todas as outras configurações inalteradas.RowHash

Quando estiver pronto, clique em Criar para concluir a operação.

3. No Gerenciador de Soluções, localize o arquivo que foi criado por padrão e


altere seu nome para .Class1.csRowHashTransformation.cs

Quando solicitado pelo Visual Studio se você também gostaria de alterar


todas as referências à classe, clique em Sim para confirmar a renomeação.

Salve a solução.

4. Siga as etapas 5 a 7 da receita Criando uma tarefa de fluxo de controle


personalizada neste capítulo para definir as propriedades do projeto para o
projeto recém-adicionado. As mesmas configurações padrão de namespace,
compilação e assinatura também podem ser usadas para este projeto.
5. Na definição, altere o namespace da classe
para .RowHashTransformation.csEtlWithAzure
6. Siga as etapas 9 a 10 da receita Criando uma tarefa de fluxo de controle
personalizado neste capítulo para adicionar as seguintes referências de
assembly ao projeto:RowHash

a) Microsoft.SQLServer.DTSPipelineWrap

b) Microsoft.SQLServer.PipelineHost

c) Microsoft.SQLServer.DTSRuntimeWrap

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_RowHashTransformation.txt

Ponta

Esse arquivo contém todo o código-fonte C# necessário para projetar o


componente personalizado. Use-o para copiar e colar as definições no
arquivo de classe, em vez de digitá-las. Além disso, observe que nem todo o
código-fonte necessário está listado nesta receita, mas está disponível no
arquivo de texto.

7. No Visual Studio, no arquivo, substitua as referências existentes na parte


superior da definição com as seguintes:RowHashTransformation.cs
8. using Microsoft.SqlServer.Dts.Pipeline;

9. using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

10. using Microsoft.SqlServer.Dts.Runtime.Wrapper;

11. using System;

12. using System.Collections.Generic;

13. using System.IO;


14. using System.Linq;

15. using System.Security.Cryptography;

using System.Text;
CopyExplain
16. Modifique a definição de classe para que ela derive a classe
base:ApplicationNameTaskPipelineComponent
public class RowHashTransformation : PipelineComponent
CopyExplain

O componente base contém todos os métodos e interfaces necessários para


interagir com o tempo de execução do SSIS, permitindo que você execute
operações personalizadas dentro do fluxo de dados do SSIS e interaja com o
pipeline de fluxo de dados, que fornece acesso aos dados que estão sendo
enviados por meio do fluxo de dados.

17. Implemente colocando sua definição logo antes da definição de


classe:DtsPipelineComponentAttribute
18. [DtsPipelineComponentAttribute(

19.     ComponentType = ComponentType.Transform,

20.     DisplayName = "Row Hash",

21.     Description = "Generates a hash of selected columns

22.                    in the pipeline row.",

23.     NoEditor = false,

24.     RequiredProductLevel = DTSProductLevel.DTSPL_NONE

25.     )]

public class RowHashTransformation : PipelineComponent


CopyExplain

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();

29. IDTSInput100 input = ComponentMetaData.InputCollection[0];

30. input.Name = INPUT_NAME;

31. IDTSCustomProperty100 isInternal;

32. IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

33. output.Name = OUTPUT_NAME;

34. output.SynchronousInputID = ComponentMetaData.InputCollection[INPUT_NAME].ID;

35. isInternal = output.CustomPropertyCollection.New();

36. isInternal.Name = IS_INTERNAL_CUSTOM_PROPERTY_NAME;

37. isInternal.State = DTSPersistState.PS_PERSISTASDEFAULT;

38. isInternal.TypeConverter = typeof(Boolean).AssemblyQualifiedName;

39. isInternal.Value = true;

40. IDTSOutputColumn100 rowHashColumn = output.OutputColumnCollection.New();

41. rowHashColumn.Name = ROW_HASH_COLUMN_NAME;

42. rowHashColumn.SetDataTypeProperties(DataType.DT_BYTES, 20, 0, 0, 0);

43. isInternal = rowHashColumn.CustomPropertyCollection.New();

44. isInternal.Name = IS_INTERNAL_CUSTOM_PROPERTY_NAME;


45. isInternal.State = DTSPersistState.PS_PERSISTASDEFAULT;

46. isInternal.TypeConverter = typeof(Boolean).AssemblyQualifiedName;

isInternal.Value = true;
CopyExplain

This method provides the metadata needed to configure the component at


design time and to provide the essential functionalities needed to perform the
work at runtime.

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

IDTSInput100 input = ComponentMetaData.InputCollection[INPUT_NAME];

if (input == null ||

    ComponentMetaData.InputCollection.Count == 0)

    ComponentMetaData.FireWarning(0, ComponentMetaData.Name,

NO_INPUT_MESSAGE, String.Empty, 0);

    return DTSValidationStatus.VS_ISBROKEN;

else

    if (ComponentMetaData.InputCollection.Count > 1)

    {

        ComponentMetaData.FireWarning(0, ComponentMetaData.Name,

TOO_MANY_INPUTS_MESSAGE, String.Empty, 0);

        return DTSValidationStatus.VS_ISBROKEN;
    }

    if (input.InputColumnCollection.Count == 0)

    {

        ComponentMetaData.FireWarning(0, ComponentMetaData.Name,

NO_INPUT_COLUMN_MESSAGE, String.Empty, 0);

        return DTSValidationStatus.VS_ISVALID;

    }

if (ComponentMetaData.OutputCollection.Count > 1)

    ComponentMetaData.FireWarning(0, ComponentMetaData.Name,

TOO_MANY_OUTPUTS_MESSAGE, String.Empty, 0);

    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.

Save the solution.

47. Override the method by copying its definition from the text file:PreExecute
48. IDTSInput100 input = ComponentMetaData.InputCollection[INPUT_NAME];

49. _columnCollection = new List<IDTSInputColumn100>();

50. foreach (IDTSInputColumn100 inputColumn in input.InputColumnCollection)

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

54. Override the method with the corresponding definition:ProcessInput


55. IDTSInput100 input = ComponentMetaData.InputCollection.GetObjectByID(inputID);

56. IDTSOutput100 output = ComponentMetaData.OutputCollection[OUTPUT_NAME];

57. IDTSOutputColumn100 rowHashColumn =

output.OutputColumnCollection[ROW_HASH_COLUMN_NAME];
58. Int32 rowHashColumnIndex = BufferManager.FindColumnByLineageID(input.Buffer,

rowHashColumn.LineageID);

59. while (buffer.NextRow())

60. {

61.     List<Byte[]> columnBytesCollection = new List<Byte[]>();

62.     foreach (IDTSInputColumn100 inputColumn in _columnCollection.OrderBy(c =>

c.LineageID))

63.     {

64.         Int32 inputColumnIndex =

input.InputColumnCollection.GetObjectIndexByID(inputColumn.ID);

65.         columnBytesCollection.Add( this.GetColumnValueBytes(buffer, inputColumn,

inputColumnIndex));

66.     }

67.     buffer.SetBytes(rowHashColumnIndex, this.ComputeHash(columnBytesCollection));

}
CopyExplain

The method contains the programmatic logic needed to perform work against


the data in the pipeline.ProcessInput

Save the solution.

68. Add the following private methods to the component class by copying their
definitions from the text file:

a) GetColumnValueBytes

b) ComputeHash

69. Add the event handlers in the same way:

a) OnInputPathAttached
b) OnInputPathDetached

c) OnOutputPathAttached

d) OnDeletingInputColumn

Do the same for the metadata maintenance methods:

a) InsertInput

b) InsertOutput

c) InsertOutputColumnAt

d) DeleteInput

e) DeleteOutput

f) DeleteOutputColumn

Save the solution.

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.

You can leave Visual Studio open.

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.

At runtime, the method is called by the execution engine. The transformation


extracts values from all the columns that the author of the SSIS package has
specified at design time, and gathers them in a single large binary object. This
composite value is then used to calculate the hash value. The resulting value is
then placed into a new column in the pipeline and made available to the following
components in the data flow.ProcessInput

The following methods contain the logic needed to compute the hash value:

 GetColumnValueBytes: This method extracts the value of the specified column(s)


using a retrieval function that corresponds to the column data type and returns
it as a binary array.
 ComputeHash: This method calculates a hash value from the supplied binary
array containing the column values using the hashing algorithm.SHA1Managed

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

Implantando personalizações do SSIS


Nesta receita, você implantará a tarefa personalizada e o componente
personalizado criados nas receitas anteriores deste capítulo na instância do SQL
Server em sua estação de trabalho. Você copiará os arquivos de assembly para
os destinos usados pelo tempo de execução do SSIS e os
registrará no GAC (Cache de Assembly Global) do Windows.

Você concluirá esta receita implementando essas duas personalizações em dois


pacotes SSIS. Você vai vê-los em ação – em tempo de design e em tempo de
execução.

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

Quando o arquivo em lotes for executado, os assemblies criados nas duas


primeiras receitas deste capítulo serão copiados para os locais do SSIS 2019
na unidade e, em seguida, registrados no GAC pelo utilitário de linha de
comando gacutil. Feche o editor de arquivos em lotes.C:\

2. No Windows Explorer, clique com o botão direito do mouse no arquivo


novamente e selecione Executar como administrador no menu de atalho
para executar os comandos com privilégios elevados.

Observação importante

Os privilégios de administrador são necessários para acessar as pastas onde


os binários do SSIS são mantidos e para fazer alterações no GAC.

3. Use o Windows Explorer para localizar a pasta em seu clone local do


repositório GitHub do livro de receitas e abra a solução.\Chapter05\
StarterSSISCustomizationTest.sln

A solução contém dois pacotes SSIS:

a) : O pacote irá ajudá-lo a testar a tarefa


personalizada.ApplicationNameTaskTest.dtsx

b) : O pacote irá ajudá-lo a testar o componente


personalizado.RowHashTest.dtsx

4. Abra o pacote:ApplicationNameTaskTest.dtsx
Figura 5.8 – O fluxo de controle ApplicationNameTaskTest.dtsx

O pacote contém um fluxo de controle bastante simples – dois contêineres


definidos para serem executados em sequência:

a) Um recipiente de sequência vazio, denominado Prólogo, com o qual se


inicia a execução.

b) Um segundo contêiner de sequência, denominado Trabalho, contendo


três Executar Tarefas SQL, cada uma configurada para ser executada
simultaneamente por 1 minuto, conectada ao banco de dados na instância
local do SQL Server usando três gerenciadores de conexões diferentes: ,
e .WideWorldImportersADO.NETOLE DBODBC

5. Inspecione a configuração de cada Executar Tarefa SQL. Depois disso,


inspecione os gerenciadores de conexões e os parâmetros de pacote usados
para configurá-los.

Em cada cadeia de conexão, você pode ver nomes de aplicativos diferentes.

Observação importante

Quando um gerenciador de conexões é criado no SSIS, um nome de


aplicativo padrão pode ser adicionado à cadeia de conexão automaticamente.
Dependendo do gerenciador de conexões, você pode acessar esse valor na
página Todos do editor do gerenciador de conexões. Como alternativa, você
pode controlar o valor parametrizando a propriedade de cadeia de conexão. O
valor pode ser atribuído em tempo de design ou após a implantação.

Nem todos os gerenciadores de conexões oferecem suporte a essa


propriedade.

6. No SSMS, conecte-se ao banco de dados na instância local do SQL Server e


use a caixa de diálogo Abrir arquivo para navegar até a pasta no clone local
do repositório do GitHub do livro de receitas. Abra o arquivo. O arquivo é
composto por seis partes, marcadas com algarismos romanos. Para esta
demonstração, você só usará os três comandos no .WideWorldImporters\
Chapter05\ScriptsChapter05.sqlPart I
7. No SSDT, execute o pacote no modo de depuração e retorne ao SSMS.

Enquanto estiver conectado ao banco de dados, execute a leitura das duas


instruções a partir da exibição de gerenciamento de
dados.masterSELECTsys.dm_exec_sessions

Enquanto o pacote estiver em execução, inspecione os resultados da


consulta. A primeira consulta não deve retornar nenhuma linha, enquanto três
linhas devem ser retornadas pela segunda consulta.

A coluna contém o nome do aplicativo relatado por cada gerenciador de


conexões.program_name

8. No SSDT, aguarde a conclusão das operações e pare a execução do modo


de depuração. Enquanto o editor de fluxo de controle estiver ativo, na Caixa
de Ferramentas SSIS, localize a tarefa Nome do Aplicativo.

Observação importante

Como você iniciou recentemente esta instância do Visual Studio, a nova


tarefa deve ter sido carregada automaticamente e deve ser listada no grupo
de tarefas Comum.

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.

9. Arraste a tarefa Nome do Aplicativo para o contêiner de sequência do


Prólogo.

Observação importante

Infelizmente, em uma nova instalação do SQL Server e do Visual Studio 2019


com SSDT e os modelos do Integration Services, o seguinte erro pode ocorrer
ao tentar colocar a tarefa personalizada no fluxo de controle:

Não é possível criar uma tarefa a partir de XML para a tarefa "", digite ""
devido ao erro 0x80070057 "O parâmetro está incorreto".

Isso provavelmente significa corrupção em um dos recursos compartilhados


do SQL Server e só pode ser corrigido reparando a instalação do SQL Server.
Observe que apenas os recursos compartilhados precisam ser reparados,
não toda a instalação do SQL Server.

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

Por padrão, as tarefas personalizadas não têm um editor genérico associado


a elas e, a menos que você crie um editor personalizado e o associe à tarefa
personalizada em tempo de design, nenhum editor estará disponível para ela.
Você pode encontrar mais informações sobre editores de tarefas
personalizados online, no artigo intitulado Desenvolvendo uma interface do
usuário para uma tarefa personalizada,
em https://docs.microsoft.com/en-us/sql/integration-services/extending-
packages-custom-objects/task/developing-a-user-interface-for-a-custom-task.

Todas as propriedades públicas de uma tarefa personalizada são expostas ao


ambiente de desenvolvimento como propriedades da tarefa, acessíveis por
meio do painel Propriedades no SSDT quando a tarefa é selecionada no
designer de fluxo de controle.

Portanto, um editor personalizado pode não ser realmente necessário;


especialmente para uma tarefa simples como esta onde, na maioria dos
casos, nada realmente precisará ser configurado de qualquer maneira.

11. Execute o pacote no modo de depuração novamente, alterne de volta para o


SSMS e execute as duas instruções novamente.SELECT

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

12. Volte para SSDT, aguarde a conclusão das operações e pare a execução do


modo de depuração.
13. Agora você pode fechar o pacote, mas deixar o SSDT
aberto.ApplicationNameTaskTest.dtsx
14. Antes de testar o componente personalizado, você precisa criar um novo
banco de dados com três novas tabelas.
15. No SSMS, localize o script. Inspecione as instruções e, em seguida, execute-
as, uma a uma, para criar o banco de dados e, nele, dois novos esquemas e ,
seguido por estas três tabelas:Part IIChapter05.sqlWideWorldAnalysisDWETL

a) DW. PurchaseOrders – a tabela de destino final

b) ETL. PurchaseOrders_New – uma tabela de preparo para armazenar


novos dados antes da inserção final
c) ETL. PurchaseOrders_Modified – uma tabela de preparo para armazenar
dados modificados antes da atualização final

16. No SSDT, abra o pacote:RowHashTest.dtsx

Figura 5.9 – O fluxo de controle RowHashTest.dtsx

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

O primeiro fluxo de dados, que está atualmente em erro, deve extrair os


dados de origem do banco de dados e, em seguida, com base no fato de as
linhas já existirem na tabela de destino ou não, carregar os novos dados em
uma tabela de preparo e modificar os dados em outra.WideWorldImporters

O segundo fluxo de dados simplesmente carrega todas as novas linhas da


nova tabela de preparo de dados para o destino final.
A Tarefa Executar SQL final deve atualizar a tabela de destino final com
dados que foram alterados desde a última vez que o processo foi executado.

17. Examine mais de perto o fluxo de dados das Tabelas de Preparo de


Carga abrindo-o no editor de fluxo de dados. Está errado, pois precisa ser
preenchido:

Figura 5.10 – O fluxo de dados das Tabelas de Preparo de Carga

O fluxo de dados usa duas fontes classificadas, uma carregando os dados da


tabela de origem e a outra da tabela de destino final. A transformação Merge
Join com uma junção externa esquerda é usada para colocar todas as linhas
de origem no pipeline junto com quaisquer linhas de destino associadas com
base na coluna de chave comum.
Depois disso, duas transformações de Divisão Condicional são usadas: uma
para diferenciar entre linhas desconhecidas que precisam ser inseridas na
tabela de destino final e linhas conhecidas que podem precisar ser usadas
para atualizar as linhas da tabela de destino final.

Linhas desconhecidas são redirecionadas para uma tabela de preparo e


linhas conhecidas são redirecionadas para outra. No entanto, para manter o
uso de recursos no mínimo, somente as linhas de origem conhecidas que
são realmente diferentes das linhas de destino existentes devem ser
consideradas para a atualização.

18. Na Caixa de Ferramentas SSIS, localize a transformação Hash de Linha; ele


deve estar localizado no grupo de componentes Comum.

Observação importante

Se você não conseguir localizar a transformação Hash de Linha em qualquer


um dos grupos de componentes de fluxo de dados, 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 todos os
componentes de fluxo de dados disponíveis.

19. Arraste a transformação para o designer de fluxo de dados. Imediatamente,


um aviso é retornado pelo componente. Examine-o passando o mouse sobre
o ponto de exclamação exibido na imagem do componente ou abrindo o
painel Lista de Erros.

Ponta

Se o painel Lista de Erros não estiver visível, você poderá acessá-lo por


meio do menu Exibir.

20. Conecte o caminho de dados de saída do componente de origem Ordens de


compra de origem (WideWorldImporters) ao componente Hash de linha.

O aviso deve desaparecer agora.


21. Clique duas vezes na transformação Hash de Linha ou clique nela com o
botão direito do mouse e selecione Editar... no menu de atalho, para abrir
o Editor Avançado.

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.

Você pode encontrar mais informações sobre editores de componentes


personalizados online, no artigo intitulado Desenvolvendo uma interface do
usuário para um componente de fluxo de dados,
em https://docs.microsoft.com/en-us/sql/integration-services/extending-
packages-custom-objects/data-flow/developing-a-user-interface-for-a-data-
flow-component.

22. Na guia Colunas de Entrada, todas as colunas já devem estar selecionadas,


o que significa que, quando o fluxo de dados for executado, os dados
em todas elas serão usados para calcular o hash de linha. Isso não é
realmente necessário: a coluna é a chave primária na origem e o destino, as
tabelas e as colunas e não são significativas quando os dados são
transferidos do banco de dados de origem para o banco de dados de
destino.PurchaseOrderIDLastEditedByLastEditedDate
23. Desmarque todas as três colunas, conforme mostrado na captura de tela a
seguir:
Figura 5.11 – Selecionando as colunas de entrada de transformação de hash
de linha

24. Quando estiver pronto, clique em OK para confirmar as alterações.


25. Conecte o caminho de saída da transformação Hash de Linha à
transformação Junção Esquerda. O fluxo de dados agora deve estar
completo e não mais em erro.
26. Inspecione as transformações de junção esquerda, conhecida ou
desconhecida?, e modificada ou não modificada?, para ver como o pipeline
foi implementado para distinguir entre linhas conhecidas e desconhecidas,
bem como entre linhas alteradas e inalteradas.
27. Verifique os componentes de destino para ver para onde os dados do pipeline
são enviados. Você pode ver que os valores de hash, calculados durante a
execução na transformação Hash de Linha, também são inseridos nas
tabelas de destino.

Salve o pacote.

28. Execute o pacote no modo de depuração e observe o fluxo de dados. Durante


a execução inicial, todas as linhas serão consideradas desconhecidas,
direcionadas para a tabela de preparo e, em seguida, todas elas serão
inseridas na tabela.Load Staging
TablesETL.PurchaseOrders_NewDW.PurchaseOrders

No SSMS, você pode usar as consultas no script para inspecionar os dados


em detalhes; no entanto, para entender o pacote SSIS, basta examinar os
números de linha no fluxo de dados ativo.Part IIIChapter05.sql

29. Quando todas as operações tiverem terminado, pare a execução do modo de


depuração. No SSMS, localize o script. Use as três instruções para modificar
os dados de origem no banco de dados. Ao todo, cinco linhas devem ser
afetadas pelas atualizações.Part IVChapter05.sqlUPDATEWideWorldImporters
30. No SSDT, execute o pacote novamente no modo de depuração e observe o
fluxo de dados mais uma vez. Todas as cinco linhas que você modificou na
etapa anterior agora devem ser redirecionadas para a tabela de preparo.Load
Staging TablesETL.PurchaseOrders_Modified

Quando todas as operações tiverem terminado, pare a execução do modo de


depuração.

Se você planeja trabalhar na receita final deste capítulo, Atualizando um


componente de fluxo de dados personalizado, agora você deve fechar a
solução.SSISCustomizationTest.sln

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

Após uma implantação bem-sucedida, você implementou a tarefa Nome do


Aplicativo em um pacote SSIS, o que facilitou a identificação de operações
invocadas pelo pacote na instância do SQL Server de destino. Depois disso, você
implementou a transformação Hash de Linha em outro pacote SSIS para fornecer
um fluxo de dados eficiente capaz de detectar quais dados são realmente
necessários no destino final.

Atualizando um componente de fluxo de


dados personalizado
Quando você determina que um componente personalizado que pode já ter sido
implantado para uso em produção precisa ser modificado – por exemplo, para
implementar uma correção de bug, adicionar uma melhoria ou simplesmente
estender seus recursos – você pode aproveitar um recurso interno da classe para
automatizar a atualização.PipelineComponent

Ponta

Em geral, todas as alterações necessárias para a atualização devem ser


entregues sem a necessidade de intervenção do usuário – por exemplo, se a nova
versão usa propriedades que não estavam disponíveis na(s) versão(ões)
anterior(es), os valores padrão também devem ser fornecidos.

Depois que a nova versão do componente tiver sido implantada no ambiente de


destino, a atualização será executada automaticamente:

 Em tempo de design, quando o pacote que implementa o componente é


aberto no SSDT

 Em tempo de execução quando o pacote que implementa o componente é


executado

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

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

No Visual Studio, abra o arquivo de classe.RowHashTransformation.cs

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,

6.     DisplayName = "Row Hash",

7.     Description = "Generates a hash of selected columns in the pipeline row.",

8.     NoEditor = false,

9.     RequiredProductLevel = DTSProductLevel.DTSPL_NONE,
10.     CurrentVersion = 2

    )]
CopyExplain

As informações de versão serão usadas pelo tempo de execução do SSIS


para detectar se uma atualização é necessária ou não.

11. Adicione mais duas constantes privadas; Você pode colocá-los abaixo dos
existentes:
12. private const String COLUMN_ORDER_CUSTOM_PROPERTY_NAME = "Ordinal";

private const String DUPLICATE_ORDINAL_VALUE_MESSAGE = "Ordinal values must be

unique. Duplicate ordinal values encountered: {0}.";


CopyExplain
13. Altere o tipo de dados da variável privada:_columnCollection
private SortedList<Int32, IDTSInputColumn100> _columnCollection;
CopyExplain

Na versão original, essa variável utilizava o tipo genérico, enquanto na nova


versão vai utilizar o tipo. O novo tipo classifica automaticamente todos os
valores colocados na lista por suas chaves. Mais sobre isso mais
tarde.ListSortedList

Salve a solução.

14. No método, localize o seguinte teste:Validate


15. if (input.InputColumnCollection.Count == 0)

16. {

17.     ComponentMetaData.FireWarning(0, ComponentMetaData.Name,

NO_INPUT_COLUMN_MESSAGE, String.Empty, 0);

18.     return DTSValidationStatus.VS_ISVALID;

}
CopyExplain
Substitua-o pela versão estendida, localizada no arquivo, abaixo do
comentário.Chapter05_RowHashTransformation_Upgrade.txtValidate - extend
input column count check

A regra adicional verificará se as novas propriedades personalizadas da


coluna de entrada contêm valores exclusivos para cada coluna de entrada
selecionada.

19. No método, substitua os comandos existentes usados para inicializar e


preencher a variável pelo seguinte:PreExecute_columnCollection
20. _columnCollection = new SortedList<Int32, IDTSInputColumn100>();

21. foreach (IDTSInputColumn100 inputColumn in input.InputColumnCollection)

22. {

23.     _columnCollection.Add( (Int32)inputColumn.CustomPropertyCollection[COLUMN_OR

DER_CUSTOM_PROPERTY_NAME].Value, inputColumn);

}
CopyExplain

A nova propriedade personalizada da coluna de entrada será usada como a


chave de classificação de coluna na variável. Mais sobre isso mais
tarde._columnCollection

24. No método, altere a maneira como a variável é usada ao processar as


colunas da linha de pipeline fornecida:ProcessInput_columnCollection
foreach (IDTSInputColumn100 inputColumn in _columnCollection.OrderBy(c =>

c.LineageID))
CopyExplain

Este:

foreach (IDTSInputColumn100 inputColumn in _columnCollection.Values)


CopyExplain

Quando uma variável de tipo é enumerada, os itens são retornados em ordem


crescente das chaves, por padrão.SortedList
25. Crie mais espaço após o método e substitua o método base com a seguinte
definição:ProcessInputReinitializeMetaData
26. this.CreateInputCustomProperties();

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

29. Int32 componentLatestVersion = pipelineComponentAttribute.CurrentVersion;

30. if (pipelineVersion < componentLatestVersion)

31. {

32.     this.CreateInputCustomProperties();

33. }

ComponentMetaData.Version = componentLatestVersion;
CopyExplain

Este é o método que facilita a atualização automática de uma versão mais


antiga do componente para a versão mais recente.

34. No método, localize o loop usado para selecionar automaticamente todas as


colunas de entrada quando a entrada do componente é
anexada:OnInputPathAttachedforeach
35. foreach (IDTSVirtualInputColumn100 inputColumn in input.VirtualInputColumnCollection)

36. {

37.     Int32 inputColumnLineageID = inputColumn.LineageID;

38.     input.SetUsageType(inputColumnLineageID, DTSUsageType.UT_READONLY);

}
CopyExplain
Altere o loop para que ele agora inclua a criação da propriedade
personalizada da coluna de entrada:

foreach (IDTSVirtualInputColumn100 inputColumn in input.VirtualInputColumnCollection)

    Int32 inputColumnLineageID = inputColumn.LineageID;

    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.

40. Crie o projeto usando a configuração Debug e, se bem-sucedido, altere a


configuração para Release e compile a solução novamente.

Em caso de erros, inspecione as mensagens de erro, faça as correções


necessárias e repita a compilação.

41. Execute o arquivo, localizado na pasta, para implantar a nova versão do


componente.DeployCustomizations.batC:\ETL-with-Azure\Chapter05\FilesRow
Hash
42. No SSDT, abra a solução. Se você deixou o pacote aberto quando editou esta
solução pela última vez, o componente deve atualizar
automaticamente.SSISCustomizationTest.slnRowHashTest.dtsxRow Hash

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

Qualquer solução do Visual Studio 2019 que contenha um projeto que


implemente tarefas ou componentes personalizados precisa ser fechada e
reaberta toda vez que você reimplantar essas tarefas ou componentes. Caso
contrário, as versões mais recentes das personalizações não serão
carregadas automaticamente. Simplesmente atualizar o SSIS Toolbox não
ajudará, infelizmente.

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:

a) Quantas linhas foram identificadas como alteradas?


b) Quantas linhas você realmente alterou antes dessa última execução?

Agora você pode fechar ambas as instâncias do Visual Studio.

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

Quando o método é chamado em tempo de design ou em tempo de execução, a


atualização começa recuperando o novo número de versão do . Se a versão atual
do componente for inferior, o método executará a atualização do recurso
adicionando novas propriedades personalizadas nas colunas de
entrada.PerformUpgradeDtsPipelineComponentAttribute

No final da atualização, o número da versão atual é substituído pelo novo, o que


significa uma atualização bem-sucedida e impede que a atualização seja tentada
novamente.

Os métodos a seguir fornecem a lógica programática necessária para garantir que


todas as colunas de entrada selecionadas em tempo de design contenham a
propriedade personalizada usada para determinar a ordem em que as colunas
devem ser processadas em tempo de execução quando os dados de pipeline são
processados no método:ProcessInput

 InputColumnCustomPropertyExists : O método é usado para verificar se uma


propriedade personalizada com um nome específico já existe na coluna de
entrada fornecida da entrada fornecida.
 CreateInputCustomProperties: O método é usado para adicionar propriedades
personalizadas à entrada fornecida.
 CreateInputColumnCustomProperties : O método é usado para adicionar
propriedades personalizadas em uma determinada coluna de entrada da
entrada fornecida.

A versão 2 da transformação permite que o desenvolvedor do pacote SSIS


determine a ordem na qual os valores das colunas selecionadas devem ser
concatenados em uma única matriz binária usada no cálculo do valor de hash. Na
versão 1, as colunas foram processadas na ordem determinada quando as
colunas foram selecionadas em tempo de projeto. Na versão 2, as colunas serão
processadas na ordem especificada pela propriedade personalizada
Ordinal input column. A ordem correta é garantida pelo tipo de dados usado pela
variável.SortedList

Capítulo 6: Azure Data Factory


O Azure Data Factory (ADF) é uma ferramenta ETL/ELT de fato no Azure. O
serviço é muito popular para lidar com carga de dados e transformações. Este
capítulo mostrará como o Data Factory pode ser usado como um serviço de
orquestração central e como alguns de seus conjuntos de ferramentas podem ser
usados para transformar dados.

Abordaremos as seguintes receitas do Azure Data Factory neste capítulo:

 Criação de data factory

 Copiar dados da Internet

 Movendo e transformando dados

 Acionamento e monitoramento de nosso pipeline

Vamos começar criando nossa data factory.

Criação de data factory


Esta é a nossa primeira receita neste capítulo. Criaremos e exploraremos os
vários componentes do Data Factory. As receitas a seguir usarão o mesmo data
factory para mover e transformar dados.

Conforme mostrado no diagrama a seguir, um data factory contém os seguintes


componentes. O Armazenamento do Azure e o Banco de Dados SQL não fazem
parte da fábrica; eles são apenas um exemplo de uma atividade de cópia simples
que o Data Factory pode fazer:

Figura 6.1 – Uma visão geral do Azure Data Factory

Os dois componentes principais são gatilhos e pipelines.

Um gatilho é essencialmente um mecanismo que inicia uma execução de pipeline.


Existem três tipos de gatilhos:

 Agendador: Pode ser baseado em uma programação de relógio de parede


ou com base em janelas de tombamento. Uma janela de tombamento
essencialmente aciona a execução do pipeline a cada n vezes: por exemplo,
a cada 5 minutos, horas e assim por diante.
 Evento: detecta a presença de um arquivo em uma conta de Armazenamento
do Azure. Uma vez que o arquivo é detectado, o pipeline é executado.
 Manual: Pode ser executado de forma ad hoc. Um usuário iniciará o pipeline
manualmente todas as vezes.

Um pipeline é um contêiner para atividades. No diagrama anterior, podemos ver


uma atividade de cópia que pega dados de um banco de dados SQL do Azure e
os copia para uma conta de armazenamento. Os outros componentes de um
pipeline são os seguintes:

 Serviços vinculados (conexão): como os gerenciadores de conexões SSIS,


eles são usados para conectar a fábrica a vários recursos que podem ser
serviços de armazenamento ou computação.
 Conjunto de dados: um conjunto de dados é a representação de esquema
dos dados conectados por meio de um serviço vinculado. É assim que uma
atividade sabe como mapear dados de uma origem para o destino (coletor).
 Tempo de Execução de Integração (IR) do Azure: usado para conectar os
serviços vinculados do Data Factory a diferentes serviços do Azure.
 Parâmetros: Como os parâmetros SSIS, podemos usá-los para alterar o
comportamento de uma execução de pipeline de fábrica.

Agora que conhecemos os principais componentes de uma data factory, vamos


criar um.

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!

1. Na sua Assinatura do Azure, clique em + Criar um recurso.


2. Na folha do Azure exibida, selecione Integração à esquerda e Data
Factory à direita, conforme mostrado na captura de tela a seguir:
Figura 6.2 – Adicionar um novo data factory

3. Nomeie a fábrica precedida ou seguida de suas iniciais, pois o


nome ETLInAzure provavelmente não estará disponível. O nome do data
factory deve ser exclusivo no Azure. Conforme mostrado na captura de tela a
seguir, selecione a versão V2, seu nome de
assinatura, ETLInAzureCookBook e sua região desejada. Desmarque a
propriedade Enable GIT. Não usaremos o Git, um serviço de controle de
código-fonte, para as receitas deste livro:ETLInAzure
Figura 6.3 – Nova lâmina de data factory

4. Clique em Criar na parte inferior da tela para criar o data factory.


5. Depois que o data factory for criado, navegue até ele. Conforme mostrado na
captura de tela a seguir, há muitos componentes na folha Data Factory:

Figura 6.4 – Folha do Azure Data Factory no portal

6. Aqui está a descrição dos gráficos padrão:

a) Documentação: Clicar nele navegará até as páginas de documentação do


Data Factory no site de documentação do Microsoft Azure.

b) Autor e Monitor: Esta é a ferramenta que nos permitirá adicionar e


modificar (autor) a fábrica.

c) PipelineRuns, ActivityRuns e TriggerRuns: Um gráfico que mostra


quantas atividades ou gatilhos de pipelines foram executados e se eles foram
bem-sucedidos ou falharam. Como veremos mais adiante; Os dutos são os
principais componentes.
d) CPU de Tempo de Execução de Integração e Memória de Tempo de
Execução de Integração: Quanta CPU e memória um tempo de execução de
integração está usando. Isso é para uso do SHIR (Self-Hosted Integration
Runtime). Um SHIR é um pequeno programa que é instalado em um PC (ou
VM) em uma rede corporativa. Eles permitem uma comunicação segura e
criptografada entre a fábrica no Azure e a rede corporativa. Para obter mais
informações sobre tempos de execução de integração, navegue
até https://docs.microsoft.com/en-us/azure/data-factory/concepts-integration-
runtime.

É isso! Criamos nossa fábrica de dados!

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.

Copiar dados da Internet


Esta receita irá ensinar-lhe como podemos ligar-nos a uma fonte de dados a partir
de um URL público da Internet. Vamos usar dados demográficos de status de
renda (SOI) do Internal Revenue Service (IRS). Exploraremos e
transformaremos esses dados com nosso ambiente de espaço de trabalho
Databricks.

Obteremos dados dos seguintes links:

 https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv: Este é um arquivo CSV que


contém as rendas do ano de 2017 por estado por CEP.
 https://worldpopulationreview.com/static/states/abbr-name.csv: Este arquivo
CSV contém abreviações de estado (códigos) e nomes de estado.
O primeiro arquivo contém dados de renda e códigos de estado. Usaremos o
segundo arquivo para aumentar o primeiro com nomes de estado. Também vamos
agregar a ficha de renda estadual para obter uma receita estadual por estado em
vez de CEP.

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:

a) Dois serviços vinculados, um para cada arquivo que vamos recuperar da


internet.

b) Um serviço vinculado que aponta para um armazenamento do Azure.

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!

1. No portal do Azure (portal.azure.com), vá para o data factory que criamos na


primeira receita deste capítulo, Criação de data factory. Clique em Author &
Monitor para acessar o painel de design da fábrica, conforme mostrado na
captura de tela a seguir:

Figura 6.5 – Data Factory – Autor & Monitor


2. Para criar serviços vinculados, precisamos criar um pipeline em branco
primeiro. Na página inicial do Data Factory, clique no ícone de pipeline do
autor, conforme mostrado na captura de tela a seguir:

Figura 6.6 – Ícone de pipeline do Data Factory Author

3. Uma vez no painel Pipeline do autor, nos deparamos com um pipeline em


branco. Vamos adicionar serviços vinculados (conexões) aos arquivos da
internet. Clique no link Conexões na parte inferior esquerda do painel Autor,
conforme mostrado na captura de tela a seguir:

Figura 6.7 – Ícone Conexões de pipeline do Data Factory

4. Duas guias diferentes estão disponíveis aqui: Serviços


vinculados e Tempos de execução de integração. O primeiro nos permite
conectar-se a diferentes serviços de armazenamento de dados e
computação. O primeiro é usado para permitir que nos conectemos a pacotes
SSIS locais no Azure ou regiões específicas do Azure e capacidades de
computação. Por enquanto, usaremos serviços vinculados. Como mostrado
na captura de tela a seguir, clique no sinal + para adicionar uma nova
conexão:
Figura 6.8 – Pipeline do Data Factory – adicionar conexão

5. A folha Novo serviço vinculado aparece à direita. Mais uma vez, temos aqui


duas opções. Podemos criar um serviço vinculado para nos conectarmos a
um armazenamento de dados ou a uma capacidade de computação. Uma
conexão com um armazenamento de dados nos permite acessar um arquivo
armazenado. Uma conexão de computação nos permite conectar-nos à
capacidade de computação, como o Azure HDInsight, o Azure Databricks e
assim por diante. Há mais de 90 conexões de armazenamento de dados. Por
enquanto, vamos nos conectar a um armazenamento de dados da internet.
Clique em Arquivo e selecione HTTP e clique em Continuar conforme
mostrado na captura de tela a seguir:
Figura 6.9 – Data Factory – adicionando um armazenamento de dados HTTP

6. A página Novo serviço vinculado (HTTP) é exibida –


insira LNK_Abbreviations para a
propriedade Name, https://worldpopulationreview.com/static/states/abbr-
name.csv para URL Base e use Anonymous como tipo de autenticação.
Clique em Testar conexão conforme mostrado na captura de tela a seguir.
Clique em Criar uma vez que a conexão é testada com sucesso:
Figura 6.10 – Abreviações do Data Factory – Detalhes do armazenamento de
dados HTTP

7. Adicione outro serviço vinculado HTTP. Desta vez, chamem-


lhe LNK_StatesIncomeData.
Use https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv para URL
Base e Anonynous como tipo de autenticação. Clique em Testar
conexão e Criar para criar o serviço vinculado.
8. Agora você deve ter dois serviços vinculados criados, conforme mostrado na
captura de tela a seguir:

Figura 6.11 – Abreviações do Data Factory – armazenamento de dados HTTP


criado

9. Agora que criamos nossos dois serviços vinculados de origem, vamos criar


nossos serviços vinculados de destino ou coletor. Adicione outro serviço
vinculado usando o Armazenamento de Blobs do Azure, conforme
mostrado na captura de tela a seguir. Clique no Create:
Figura 6.12 – Data Factory – adicionar um armazenamento de dados de
armazenamento de blob

10. Use LNK_ETLInAzure para o nome, selecione sua assinatura e


use etlinazure para Nome da conta de armazenamento. Clique em Testar
conexão e Criar para criar o serviço vinculado, conforme mostrado na
captura de tela a seguir:
Figure 6.13 – Data Factory – add blob storage data store details
11. We now have created our connections. The next step is to create datasets on
top of them. Datasets are the schema definitions of our data, the contract we
have between the source and sinks. Sources provide columns and data types
and targets agree to this contract. Make sure you are on the Author tab. From
the Factory Resources section, click on the + sign and select Dataset from
the menu that appears, as shown in the following screenshot:

Figure 6.14 – Dataset creation

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

13. Select DelimitedText as the format and click on Continue as shown in the


following screenshot.
Use DelimitedText1 for Name, LNK_Abbreviations for Linked
service, From connection/store for Import schema, and GET for Request
method. Click on OK to save the dataset as shown in the following
screenshot:
Figure 6.16 – Data Factory – add HTTP dataset properties

14. Rename the dataset .DS_StateAbbreviationHTTP


15. Go to the Schema tab, click on Import schema, and select From
connection/store from the submenu that appears, as shown in the following
screenshot:
Figure 6.17: Data Factory – add an HTTP dataset properties import schema

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

20. Add another Azure Blob Storage dataset, name


it DS_StateIncomeDataParquet, use LNK_ETLInAzure for Linked
service, adf/stateIncomeData/stateIncomeData.parquet for File
path, None for the Import schema property, and check First row as header.
Click OK.
21. We have now created our two sink schemas created. It's now time to use
them. From the Factory Resources section, click on the + sign and add a
new pipeline. Name it P_StateIncomeMappingDataflow as shown in the
following screenshot:

Figure 6.20 – Data Factory – new pipeline

22. From the Activities section, expand the Move & transform section. Drag and


drop a Copy data activity on the pipeline. Name
it ACT_CPY_StateAbbreviations as shown in the following screenshot:
Figure 6.21 – Data Factory new copy activity

23. Click on the Source tab and select the DS_StateAbbreviationHTTP dataset.


24. Click on the Sink tab and select DS_StateAbbreviationParquet.
25. Click on the Mapping tab and click on Import schemas. Rename the sink
column names as shown in the following screenshot:

Figure 6.22 – Data Factory new copy activity Mapping tab


26. Let's test our new copy activity now. From the top of the pipeline, click
on Debug. The copy activity will copy the data successfully, as shown in the
following screenshot:

Figure 6.23 – Data Factory new copy activity debug success

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

Figure 6.24 – Data Factory new copy activity – stateAbbreviations.parquet

28. Add a new Copy activity and name it ACT_CPY_StateIncomeData.


29. Select DS_StateIncomeDataHTTP as the source dataset
and DS_StateIncoemDataParquet as the sink dataset.
30. On the Mapping tab, select Import mapping. Remove all columns
except STATE and A02650 as shown in the following screenshot:
Figure 6.25 – Data Factory – new copy activity stateIncomeData on the
Mapping tab

31. Click Debug at the top of the pipeline. The two copy activities will run
successfully, as shown in the following screenshot:

Figure 6.26 – Data Factory – new copy activity stateIncomeData execution

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:

Figure 6.28 – Data Factory Publish all icon

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.

That's it! We have completed our first pipeline.

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

A edição de um data factory é feita através de um navegador da web. Isso nos


permite trabalhar de vários dispositivos sem precisar instalar o Visual Studio, como
fizemos para as ETLs SSIS locais. Publicar a fábrica no ambiente ao vivo é o
método mais simples. Em cenários da vida real, você usaria o controle do código-
fonte, como o Git, para salvar as alterações de fábrica. O ambiente dinâmico
conteria alterações gerenciadas do Git, a ramificação principal. Para simplificar,
nesta receita, não usamos o controle de origem, mas é uma obrigação em
cenários do mundo real.

Movendo e transformando dados


Copiamos dados em nossa conta de armazenamento na receita
anterior, Copiando dados da internet. Nesta receita, vamos unir e transformar os
dois conjuntos de dados usando um fluxo de dados de mapeamento. Eles contêm
muitas ferramentas que nos ajudam a unir, mapear e agregar nossos conjuntos de
dados de origem para produzir outro conjunto de dados de saída (coletor).

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.

Então, vamos nos aprofundar em nossa receita!

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!

1. Abra o designer do Data Factory no portal do Azure clicando no link Autor &


Monitor.
2. Vá o pipeline que criamos na receita
anterior: P_StateIncomeMappingDataflow. Na seção Atividades,
expanda Mover & Transformar. Arraste e solte uma atividade de fluxo de
dados no pipeline. No painel que aparece à direita do designer,
selecione Criar novo fluxo de dados, escolha Mapeamento de fluxo de
dados e clique em OK, conforme mostrado no seguinte screenshot:
Figura 6.29 – Data Factory – adicionando um fluxo de dados de mapeamento

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

4. Ative a depuração de fluxo de dados. Na parte superior do fluxo de dados,


deslize no ícone de depuração de fluxo de dados, conforme mostrado na
captura de tela a seguir:

Figura 6.30a – Data Factory – ativar depuração

5. Uma janela pop-up é exibida e nos pede para selecionar um tempo de


execução de integração. Use AutoResolveIntegrationRuntime e clique
em OK como mostrado na captura de tela a seguir. O Data Factory iniciará
um cluster Databricks para obter alguns recursos de computação para a
operação. Pode levar de 5 a 10 minutos para iniciar o cluster.
Figura 6.30b – Data Factory – ative a depuração e selecione Tempo de
execução de integração

6. Agora, clique em Adicionar fonte. Se um tutorial de ajuda for exibido, clique


em Avançar e em Finish para passar as etapas. Na seção Configurações
de origem, use StateAbbreviation para Nome do fluxo de saída.
Selecione DS_StateAbbreviationParquet para a propriedade Dataset.
Desmarque a opção Permitir desvio de esquema. O desvio de esquema nos
permite permitir alterações de esquema a partir do conjunto de dados de
origem. Por exemplo, podemos ter uma fonte que contém uma
coluna EmployeeName e outro arquivo pode ter a mesma coluna
chamada Name. Permitir a deriva de esquema nos permitiria mapear essas
duas colunas para a mesma coluna de entrada sem falhar em nosso fluxo de
dados. Verifique se a propriedade Sampling está definida como Desativar.
Não precisamos amostrar nossos dados porque nossas fontes de dados são
muito pequenas. Sua tela deve se parecer com a seguinte captura de tela:
Figura 6.31 – Data Factory – adicionando uma fonte a um fluxo de dados de
mapeamento

7. Para Opções de origem, deixe as propriedades padrão. Não temos nada de


especial para fazer aqui para a nossa receita.
8. A guia Projeção nos permite obter o esquema de nossa fonte. Clique
em Importar projeção. Podemos ver o esquema na tela mostrada na captura
de tela a seguir. A fonte StateAbbreviation foi atualizada para 2 colunas
totais:

Figura 6.32 – Data Factory – recuperando um esquema para uma fonte no


fluxo de dados de mapeamento

9. A guia Otimizar nos permite definir o particionamento para o código-fonte.


Para fontes de dados muito grandes, o uso do particionamento melhorará
muito o desempenho do nosso fluxo de dados. Transformar dados requer
recursos de computação e devemos alugá-los (e pagá-los). Quanto menos
tempo gastarmos transformando os dados, menor será o custo. Como temos
uma fonte muito pequena e ela não está particionada, não vemos nenhuma
partição aqui. Deixe a opção Partição definida como Usar particionamento
atual, conforme mostrado na captura de tela a seguir:

Figura 6.33 – Data Factory – a guia Otimizar para uma fonte no mapeamento
do fluxo de dados

10. A guia Inspecionar nos mostrará o esquema e nos permitirá classificar nas


colunas Ordem, Nome e Tipo. Pode ser útil usar essa guia quando temos
uma fonte de dados com muitas colunas. A guia Inspecionar é mostrada na
captura de tela a seguir:

Figura 6.34 – Guia Inspecionar o Data Factory para uma fonte no


mapeamento do fluxo de dados

11. A guia Visualização de dados nos permite ver os dados na origem. Clique no


ícone Atualizar conforme mostrado na captura de tela a seguir:
Figura 6.35 – A guia Data Factory Preview para uma fonte antes de atualizar
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

14. We can also apply transformations to the column's data by clicking on


the Modify button at the top of the column, as shown in the following
screenshot:
Figure 6.38 – The Data Factory Preview tab for a source with the Modify
column's data 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

17. Click on Add Source to add our StateIncomeData parquet file. Follow the


same steps as we did for the StateAbbreviation source. The Projection tab
should look like the following screenshot:
Figure 6.41 – The Data Factory Project tab for the StateIncomeData 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

20. Next, hit the Refresh button to refresh the previewed data and click


on Statistics again. We see that the statistics are now calculated
on 27760 rows, as shown in the following screenshot:
Figure 6.44 – Data Factory Statistics on the entire dataset for mapping data
flow

21. We are now going to enrich our StateIncomeData source with


the stateName column from StateAbbreviation. Click on the + sign of
the StateIncomeData source and select Lookup from the submenu that
appears, as shown in the following screenshot:
Figure 6.45 – Data Factory Lookup transform for the mapping data flow

22. A Lookup transformation is added to the data flow. In the Join


Lookup settings pane, set Output Stream
Name to LKPStateAbbreviation. Primary stream is already set
to StateIncomeData because we added the lookup transformation from there.
Set Lookup stream to the StateAbbreviation source. Set the other lookup
conditions as shown in the following screenshot:

Figure 6.46 – Data Factory Lookup settings for mapping data flow

23. Click on the Optimize tab. Set the Broadcast property to Fixed. This will


ensure that the smallest data source will be replicated to all worker nodes in
the cluster. This give us a performance improvement if we have larger data
sources that want to look up the StateAbbreviation source, and the data can
fit in the worker node memory. Check Right:
'StateAbbreviation' in Broadcast options and leave the partitioning setting
as it is, as shown in the following screenshot:

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

25. Click on the Data preview tab and refresh it. Select the stateName column


and click on Statistics. We can see the stateName information distribution
after the lookup as shown in the following screenshot. What's more important
is that we can see that we have a perfect match as we get 27760 Not
Null values:
Figure 6.49 – Data Factory Lookup Data preview tab with Statistics 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

28. Click on Save and finish. You should have something like the


following screenshot:

Figure 6.51 – Data Factory Mapping parameter

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

30. Click the + sign at the right of the StateIncome column and select Add


column to add a new derived column as shown in the following screenshot:

Figure 6.53 – Data Factory Derived column's settings – add a new column

31. Type PipelineRunID and click to get the Visual expression builder. In


the FUNCTIONS blade, go to the Parameters tab and click
on PipelineRunID to add the expression $PipelineRunID, as shown in the
following screenshot:

Figure 6.54 – Data Factory Derived column's settings – add a parameter


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.56 – Data Factory Select setting with four columns

34. Now, we are going to aggregate the StateIncome column by state. To do so,


add an aggregate transform to the data flow. Name it AGGStateIncome. We
now have two settings where we can select columns: Group
by and Aggregates. In the Group by setting, select abbreviation and add
two other columns: stateName and PipelineRunID, as shown in the following
screenshot:
Figure 6.57 – Data Factory Aggregate settings – Group by tab setting with
three columns

35. Now, click on Aggregates. Add the StateIncome column and use sum


(StateIncome) for the expression, as shown in the following screenshot:

Figure 6.58 – Data Factory Aggregates tab setting with a StateIncome column

36. Now, go to the Data preview Tab and refresh it. We now have 51 rows


instead of 27760. The StateIncome column has been aggregated by state as
shown in the following screenshot:
Figure 6.59 – Data Factory Aggregates Data preview tab

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];

39. CREATE TABLE [SalesLT].[IncomesPerStates]

40. (

41.     StateAbbreviation NVARCHAR(10) NULL,

42.     StateName NVARCHAR(100) NULL,

43.     StateIncome BIGINT NULL,

44.     BatchID NVARCHAR(100) NOT NULL

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

46. In the Sink tab, click on + at the right of the Dataset property to add a


new Dataset. Choose Azure SQL Database as shown in the following
screenshot and click on Continue:
Figure 6.61 – Data Factory – adding an Azure SQL Database dataset

47. Name it DS_SalesLTIncomesPerStates. Select + New from the


linked service combo box. Create a new Azure SQL Linked service as shown
in the following screenshot:
Figure 6.62 – Data Factory – adding an Azure SQL Database linked service

48. Click on Test connection and Save to save the new linked service. Back


to the dataset properties, select Create new table, use SalesLT for the
schema name and IncomesPerStates for the table name, as shown in the
following screenshot:

Figure 6.63 – Data Factory – adding an Azure SQL Database dataset

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

50. Go to the Mapping tab. Turn Auto mapping off. Select and move


the StateIncome column above the PipelineRunID column as shown in the
following screenshot. Rename the columns in the Output columns window:

Figure 6.65 – Data Factory Sink Mappings tab – move StateIncome up

51. Now, go back to the P_StateIncomeMapping pipeline and link it to the


two Copy data activities.
52. Select the Mapping Data Flow and click on the Parameters tab. Click on the
textbox at the right of PipelineRunID. This will open a blade called Add
dynamic content. As shown in the following screenshot, select Pipeline run
ID from the System variables section and click on Finish:
Figure 6.66 – Data Factory Sink Mapping data flow parameter addition

53. Our data flow is now complete. Name it DFT_StateIncomeMappingDataflow.


Attach both copy activities we created before to it. Click on the Debug button
at the top of the pipeline to run it. After a few minutes, you should have
something like what's shown in the following screenshot:
Figure 6.67 – Data Factory pipeline execution

54. Now, hover the mouse over the DFT_SalesLTincomesPerStates component.


As shown in the following screenshot, click the glasses icon to see the
detailed execution of the data flow:

Figure 6.68 – Data Factory pipeline mapping execution detail icon

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

56. Now, go back to the Azure portal and select


the AdventureWorksLT database. Click the Query editor (preview) icon.
Click on the ellipsis icon (…) and click on Select Top 1000 Rows, as shown in
the following screenshot:

Figure 6.70 – Query editor – select top 1000 rows from


SalesLT.IncomesPerStates

This will issue the following query:


SELECT TOP (1000) * FROM [SalesLT].[IncomesPerStates]
CopyExplain
57. And we get the following . If you look at the column, you can see that we now
have a real value in it:resultsetBatchIDPipelineRunID

Figure 6.71 – Query editor – Select Top 1000 Rows result

That's it! We have created our mapping data flow!

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.

Os fluxos de dados dependem de um recurso de computação – um cluster


Databricks Spark. Os fluxos de dados nos permitem escrever código Spark sem
qualquer código. Eles dependem do Tempo de Execução de Integração do Azure
para se conectar ao serviço de computação, o cluster Databricks. Podemos criar
nossos próprios tempos de execução de integração do Azure com mais opções de
computação, como memória, nós (máquinas) e CPU. Usamos o cluster padrão
(menor) possível na receita, pois não precisamos de mais nada em termos de
capacidade, pois a receita era bem simples e não envolvia grandes volumes de
dados.

Acionamento e monitoramento de nosso


pipeline
Criamos nosso primeiro pipeline e o executamos manualmente em um ambiente
de depuração. Em cenários da vida real, programaríamos um gatilho para que
nosso pipeline fosse executado. Depois que o pipeline é agendado, queremos
monitorar suas execuções, como status, contagens de linhas e tempos de
execução. Também queremos ser alertados quando uma execução falhar.

Esta receita mostrará como isso pode ser feito facilmente com o Azure Data
Factory. Ele irá ensiná-lo a realizar ações específicas:

 Carregar metadados e acumulá-los em uma conta de armazenamento

 Agende um gatilho para executar nosso pipeline

 Criar um alerta para qualquer falha de pipeline

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!

1. Abra o pipeline que criamos na receita anterior, Movendo e transformando


dados, P_StateIncomeMappingDataflow. Adicione um novo conjunto de
dados do SQL Server do Azure à fábrica. Nomeie-o DS_LoadMetadata e
selecione LNK_AdventureWorksLT como o serviço vinculado e
nenhum nome de tabela (Nenhum), conforme mostrado na captura de tela a
seguir. Clique em OK:

Figura 6.72 – Data Factory – novo conjunto de dados para coleta de


metadados

2. Crie outro conjunto de dados com base em um armazenamento de Blobs do


Azure. Escolha DelimitedText como o tipo de formato. Nomeie-
o DS_WriteLoadMetadata. Defina as propriedades da seguinte
forma: metadata/@{pipeline(). Pipeline}/@{pipeline().
RunId}.csv para Caminho do arquivo; certifique-se de que Primeira linha
como cabeçalho esteja selecionada e selecione Nenhum para Importar
esquema:
3. Defina as propriedades de conexão conforme mostrado na captura de tela a
seguir:

Figura 6.73 – Propriedades de conexão do conjunto de dados do Data


Factory para a coleta de metadados

4. Adicione uma atividade Copiar à direita do fluxo de dados de mapeamento.


Renomeie-o ACT_CPY_WriteLoadMetadata e vincule-o
a DFT_SalesLTIncomePerState.
5. Vá para a guia Origem da atividade de cópia que acabamos de adicionar.
Defina o conjunto de dados Source como DS_LoadMetadata. Defina a
propriedade Use query como Query. Copie e cole a seguinte consulta na
caixa de texto Consulta:
6. SELECT '@{pipeline().DataFactory}' as DataFactory_Name,

7. '@{pipeline().Pipeline}' as Pipeline_Name,

8. '@{pipeline().RunId}' as RunId,

9. '@{pipeline().TriggerType}' as TriggerType,

10. '@{pipeline().TriggerId}' as TriggerId,


11. '@{pipeline().TriggerName}' as TriggerName,

12. '@{pipeline().TriggerTime}' as TriggerTime,

13. 'ACT_CPY_StateAbbreviations' AS ActivityName,

14. '@{activity('ACT_CPY_StateAbbreviations').output.rowsRead}' as RowsRead,

15. '@{activity('ACT_CPY_StateAbbreviations').output.rowsCopied}' as RowsWritten,

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

21. UNION ALL

22. SELECT '@{pipeline().DataFactory}' as DataFactory_Name,

23. '@{pipeline().Pipeline}' as Pipeline_Name,

24. '@{pipeline().RunId}' as RunId,

25. '@{pipeline().TriggerType}' as TriggerType,

26. '@{pipeline().TriggerId}' as TriggerId,

27. '@{pipeline().TriggerName}' as TriggerName,

28. '@{pipeline().TriggerTime}' as TriggerTime,

29. 'ACT_CPY_StateIncomeData' AS ActivityName,

30. '@{activity('ACT_CPY_StateIncomeData').output.rowsRead}' as RowsRead,

31. '@{activity('ACT_CPY_StateIncomeData').output.rowsCopied}' as RowsWritten,


32. '@{activity('ACT_CPY_StateIncomeData').output.effectiveIntegrationRuntime}' as

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

37. UNION ALL

38. SELECT '@{pipeline().DataFactory}' as DataFactory_Name,

39. '@{pipeline().Pipeline}' as Pipeline_Name,

40. '@{pipeline().RunId}' as RunId,

41. '@{pipeline().TriggerType}' as TriggerType,

42. '@{pipeline().TriggerId}' as TriggerId,

43. '@{pipeline().TriggerName}' as TriggerName,

44. '@{pipeline().TriggerTime}' as TriggerTime,

45. 'DFT_SalesLTIncomesPerStates' AS ActivityName,

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,

48. 'N/A' as effectiveIntegrationRuntime,

49. 'N/A' AS Source_Type,

50. 'N/A' AS Sink_Type,


51. 'N/A' AS Execution_Status,

'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

53. Go to the Sink tab. Set Sink dataset to DS_WriteLoadMetadata. Leave all


other properties as their default values.
54. Now, run the pipeline using the Debug button at the top. Once it completes,
your screen should look like the following screenshot:

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:

Figure 6.76 – Storage account blob with metadata

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:

Figure 6.77 – Storage account blob metadata content

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

59. Let's choose the latter option to create our trigger. The Add


triggers blade appears. Click + New from the dropdown, as shown in the
following screenshot:

Figure 6.79 – Choose a new trigger

60. The New trigger blade appears.


Set Name to TRG_DailyLoad, Type to Schedule, and Start Date (UTC) to
any date you want. Set Recurrence to Every 1 Day(s). Execute at these
times: Hours (UTC) 21, Minutes (UTC) 00, as shown in the following
screenshot. Click on OK twice to save it:
Figure 6.80 – New trigger details

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:

Figure 6.81 – New trigger details

62. Now, click on the Manage tab and click on Triggers in the Data


Factory section. You should see that the trigger is ready to start, as shown in
the following screenshot:
Figure 6.82 – Published trigger details

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:

Figure 6.83 – The Alerts & metrics section

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:

Figure 6.85 – Configuration of the notification

69. Click on + Add notification to open the Add notification blade. As shown in


the following screenshot, enter Send email for Action Name. Check
the Email checkbox and enter a valid email address. Click on Add
notification when complete:
Figure 6.86 – Add notification

70. Click on Add action group to save the notification.


71. Back to the Alert rule name blade, your screen should look like the following
screenshot. Click on Create alert rule to create the alert:
Figure 6.87 – Add notification

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:

Figure 6.89 – Pipeline running

76. The pipeline execution screen opens as shown in the following screenshot:
Figure 6.90 – Pipeline running

77. In Activity runs, hover the mouse over


the DFT_SakesLTIncomesPerStates data flow and click on the binoculars
icon. The data flow execution details open and we can see how the data flow
executed, as shown in the following screenshot:

Figure 6.91 – Pipeline data flow 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:

Figura 6.93 – E-mail de notificação de falha de pipeline

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

83. O status do gatilho agora está definido como parado. Clique em Publicar


tudo novamente para manter a alteração no ambiente de execução de
fábrica. Se isso não for feito, o gatilho será interrompido, ele será executado
todos os dias e custará dinheiro.

É isso! Nós já industrializamos nossa fábrica!

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.

Como o Azure Data Factory, é um ambiente de desenvolvimento e implantação de


Plataforma como Serviço. Ao contrário do Data Factory, o Databricks não é
específico do Azure. Ele está disponível no Microsoft Azure, bem como na
plataforma Amazon Web Services (AWS). A principal diferença entre o Data
Factory e o Databricks do ponto de vista do ETL é que o Data Factory é um
ambiente sem código. Nós basicamente usamos atividades para fazer nosso ETL.

O Databricks usa código e blocos de anotações para obter o mesmo resultado. E


como veremos mais adiante, é a ferramenta de ETL quando se trata de big data,
seja ele medido em exabytes ou petabytes. Ele geralmente é usado em conjunto
com o Azure Data Factory quando temos essas cargas de dados, pois o Azure
Data Factory tem uma atividade Databricks para acionar blocos de anotações
Databricks.

Este capítulo abrangerá as seguintes receitas:

 Criando um espaço de trabalho Databricks

 Criando um cluster em nosso espaço de trabalho

 Conectando-se a uma fonte de dados da Internet

 Usando o Delta Lake

 Escrevendo no SQL Server do Azure

Vamos começar com a nossa primeira receita!


Criando um espaço de trabalho
Databricks
Um espaço de trabalho Databricks é um ambiente que contém ativos Databricks,
como o seguinte:

 Blocos de anotações: um bloco de anotações é uma interface que contém


uma série de comandos executáveis. É um espaço reservado para código,
visualizações e texto narrativo.
 Bibliotecas: podem ser de terceiros ou locais. Eles contêm código que pode
ser usado em blocos de anotações.
 Experimentos: Usados principalmente por aprendizado de máquina,
eles permitem a visualização de uma execução MLflow.
 Clusters: máquinas virtuais no Azure que atuam como um serviço de
computação. Eles executam o código que escrevemos em cadernos.
 Trabalhos: um trabalho é usado para executar comandos Databricks sem
usar a interface do usuário do bloco de anotações. Um trabalho é chamado
por meio de um agendador ou data factory.

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:

1. No portal do Azure, clique em + Criar um recurso e, no menu Análise,


selecione um Serviço do Azure Databricks.
2. Na folha Serviço de Databricks do Azure, preencha as propriedades
conforme mostrado na captura de tela a seguir:

Figure 7.1 – Criação de espaço de trabalho Databricks

3. Vamos nos conectar ao nosso SQL Server do Azure mais adiante neste


capítulo. Escolha a mesma região do SQL Server que criamos no Capítulo
2, Criando um Banco de Dados SQL do Azure.
4. Se quiser que o espaço de trabalho tenha acesso aos recursos da sua
empresa, clique em Rede para adicionar o espaço de trabalho em uma Rede
Virtual do Azure e configurar sub-redes. Caso contrário, clique em Revisar +
Criar e você receberá a seguinte captura de tela:
Figura 7.2 – Validação do espaço de trabalho Databricks

5. Clique em Criar na parte inferior da tela do navegador para criar o espaço de


trabalho Databricks.
6. Quando a implantação for concluída, conforme mostrado na captura de tela a
seguir, clique em Ir para o recurso para acessar a folha do espaço de
trabalho do Databricks:
Figura 7.3 – Espaço de trabalho Databricks criado

7. Na folha, clique em Iniciar Espaço de Trabalho conforme mostrado na


captura de tela a seguir para abrir o ambiente Databricks:

Figura 7.4 – Inicialização do espaço de trabalho Databricks

8. Você pousará no espaço de trabalho Databricks, conforme mostrado na


captura de tela a seguir:
Figura 7.5 – Espaço de trabalho Databricks

9. Temos vários itens disponíveis no espaço de trabalho,


como Início, Dados, Clusters, Trabalhos e assim por diante. Vamos usar
vários deles nas receitas a seguir.

É isso! Agora temos um ambiente 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.

Criando um cluster em nosso espaço de


trabalho
Um cluster é necessário para manipular e transformar dados com Databricks. É
composto por, no mínimo, duas máquinas:
 Um nó de driver: recebe os comandos e os despacha para um trabalhador.
 Um nó de trabalho: recebe e executa os comandos. Podemos usar vários
trabalhadores que executarão o comando em paralelo.

Há também dois tipos de clusters:

 Interativo: um cluster iniciado manualmente. Ele é usado para fazer


consultas interativas em um bloco de anotações ou em outro programa
conectado a ele, como o Power BI.
 Automatizado: um cluster criado automaticamente para executar um trabalho
e interrompido após ele. Por exemplo, esse tipo de cluster é usado quando
usamos uma atividade do Databricks no Azure Data Factory.

Vamos criar um cluster em nosso espaço de trabalho Databricks agora.

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:

1. No espaço de trabalho Databricks, clique no ícone Clusters na barra de


ferramentas mais à esquerda, conforme mostrado na captura de tela a seguir:
Figura 7.6 – Clusters de Databricks

2. Clique no botão + Criar cluster no canto superior esquerdo, conforme


mostrado no seguinte screenshot:

Figura 7.7 – Botão Criar cluster de Databricks

3. Na tela Criar Cluster, preencha as propriedades conforme mostrado na


captura de tela a seguir. Desmarque a caixa de seleção Habilitar
dimensionamento automático e digite na caixa de texto Trabalhadores.
Você também pode alterar Terminar após... minutos de inatividade para
um número menor do que o padrão. Clique em Criar cluster depois
de concluído:1
Figura 7.8 – Tela Criar cluster de Databricks

4. De volta à tela de clusters, seu cluster aparecerá na lista Clusters


interativos. Ele será iniciado automaticamente como mostrado na captura de
tela a seguir:
Figura 7.9 – Cluster de Databricks criado

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.

Conectando-se a uma fonte de dados da


Internet
Esta receita irá ensinar-lhe como podemos ligar-nos a uma fonte de dados a partir
de um URL público da Internet. Vamos usar dados de renda demográfica
(Estatísticas de Renda - SOI) da Receita Federal (IRS). Exploraremos e
transformaremos esses dados com nosso ambiente de espaço de trabalho
Databricks.

Obteremos dados dos seguintes links:

 https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv: Este é um arquivo CSV que


contém as rendas do ano de 2017 por estado por CEP.
 https://worldpopulationreview.com/static/states/abbr-name.csv: Este arquivo
CSV contém abreviações de estado (códigos) e nomes de estado.

O primeiro arquivo contém dados de renda e códigos de estado. Usaremos o


segundo arquivo para aumentar o primeiro com nomes de estado. Também vamos
agregar a ficha de renda estadual para obter uma receita estadual por estado em
vez de CEP.

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!

1. Abra seu Espaço de Trabalho Databricks conforme mostrado na receita


anterior, Criando um espaço de trabalho Databricks.
2. Clique no ícone Página Inicial no espaço de trabalho, selecione <seu
endereço de e-mail>, clique na seta à direita e selecione Criar > Bloco de
Anotações, conforme mostrado na captura de tela do seguinteasa:

Figura 7.10 – Adicionando um novo bloco de anotações

3. A caixa de diálogo Criar Bloco de Anotações é exibida. Conforme mostrado


na captura de tela a seguir, insira um nome para o bloco de anotações.
Usaremos Python como a linguagem padrão. Os comandos do Databricks
podem ser escritos em quatro linguagens – Python, Scala, SQL e R:
Figura 7.11 – Nomeando um novo bloco de anotações

4. Um novo bloco de anotações vazio é exibido. Um bloco de anotações pode


conter células de comentário conhecidas como "Markdown", bem como
células de código. Digite o seguinte código na primeira célula. O na célula
indica que é uma célula Markdown. Os caracteres de hashtag determinam o
tamanho da fonte:%md#
5. %md

#####Add widgets (parameters)


CopyExplain
6. Clique fora da célula. Seu bloco de anotações agora deve ter uma célula,
como na captura de tela a seguir:

Figura 7.12 – Adicionando uma nova célula Markdown para widgets

7. Um widget de entrada é um espaço reservado para um parâmetro em blocos


de anotações. Existem vários tipos de widgets de entrada: texto, lista
suspensa, caixa de combinação e seleção múltipla. Vamos usar dois
widgets de entrada: um que conterá a URL para as rendas demográficas do
estado e outro para os nomes dos estados. Isso nos permite evitar codificar
as URLs em nosso código. Passe o mouse sobre a parte inferior da primeira
célula e clique no sinal de +, conforme mostrado na captura de tela a seguir:

Figura 7.13 – Adicionando uma nova célula

8. Insira o seguinte código na célula. Pressione Ctrl + Enter para executar a


célula (certifique-se de que cada comando esteja em uma linha, caso
contrário, o comando falhará):
9. dbutils.widgets.removeAll()

10. dbutils.widgets.text("urlStateAbbr",  "https://worldpopulationreview.com/static/states/abbr-

name.csv", "State Abbreviations URL")  

dbutils.widgets.text("urlStateData", "https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv", "State

Income Data URL")


CopyExplain
11. A primeira linha de código remove todos os widgets existentes, enquanto as
outras duas linhas adicionam widgets de caixa de texto. Execute a célula e
você deve encontrar dois widgets de entrada na parte superior do bloco de
anotações, conforme mostrado na captura de tela a seguir:

Figura 7.14 – Widgets de entrada Databricks adicionados

12. Um widget de entrada é criado chamando a função. São necessários três


argumentos:dbutils.widgets.text()

a) O nome do widget de entrada: um nome exclusivo para o widget.

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

17. urlStateData = dbutils.widgets.get('urlStateData')

18. urlStateData

Out[<a number>]: 'https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv'


CopyExplain
19. Agora, vamos importar o arquivo de abreviações CSV para um DataFrame.
Adicione uma célula com o seguinte código e execute-o:
20. %md

#####Read states abbreviations into a dataframe


CopyExplain
21. Para ler a URL, estamos usando um método de pandas Python. Então, temos
que importar essa biblioteca primeiro. Além disso, estamos aplicando um
esquema ao DataFrame, caso contrário, teríamos 0 e 1 como nomes de
coluna. O próximo código cria o esquema. Um esquema é composto por
essas colunas de definição e estamos atribuindo um tipo de dados a essas
colunas, no nosso caso, . A execução da célula criará um esquema
chamado :StructTypesStringTypeabbrSchema
22. import pandas as pd

23. from pyspark.sql.types import StructType, StringType

24. abbrSchema= (StructType()


25.    .add("abbr", StringType())

26.    .add("stateName", StringType())

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

32. # Display the  dataframe

display(abbrDF)
CopyExplain

A última linha exibe o DataFrame conforme mostrado na captura de tela a


seguir:
Figura 7.15 – Databricks abbrDF DataFrame criado

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

#####Read state income data into a dataframe


CopyExplain
35. Estamos interessados em apenas duas colunas no arquivo CSV de renda
estadual: – um valor de cadeia de caracteres e , um valor longo. No código a
seguir, estamos lendo essas duas colunas; lançar como um valor longo para
poder agregá-lo. Em seguida, agrupamos o resultado por , e somamos o
elenco (originalmente nomeado antes do elenco) e o renomeamos. Adicione
uma nova célula e insira o seguinte código e execute-
o:STATEA02650A02650STATEtotalIncomeAmountA02650summedTotalIncomeAmount
36. from pyspark.sql.functions import col

37. from pyspark.sql.types import LongType

38. stateDataDF = (spark.createDataFrame(pd.read_

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

49. # Display the  dataframe

display(stateDataDF)
CopyExplain

A célula e seu resultado devem se parecer com a captura de tela a seguir


(alguns comentários foram removidos na etapa anterior para melhor
legibilidade no livro). O que eram 27760 linhas na ficha de renda do estado
foram agregados a 51 linhas. Verifique se o layout do código é o mesmo da
captura de tela a seguir:
Figura 7.16 – Databricks stateIncomeDF DataFrame criado

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.

52.                   state == abbrDF.abbr], how = "inner")

53.                  .select(col("abbr"), col("stateName"),

54.                   col("summedTotalIncomeAmount"))

55.                  .orderBy(col("abbr"))

56.                   )

57. # Display the  dataframe

display(stateIncomeDF)
CopyExplain

O código da célula e seu resultado são mostrados na captura de tela a seguir:


Figura 7.17 – Databricks – os dois DataFrames unidos

58. Agora, vamos mudar a lista para um gráfico. Clique no ícone do gráfico na


parte inferior da lista e selecione Gráfico de barras, conforme mostrado na
captura de tela a seguir:

Figura 7.18 – Seleção do gráfico de barras Databricks

Você obtém um gráfico de barras como mostrado na captura de tela g aseguir:


Figura 7.19 – Resultado do gráfico de barras Databricks

É isso! Lemos dois arquivos da internet e os transformamos para obter a receita


total do estado por estado em um único conjunto de resultados. Usaremos o
conjunto de dados criado aqui nas próximas receitas deste capítulo.

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.

As bibliotecas Python não são necessariamente otimizadas para ambientes Spark


e devem ser usadas com moderação. Quando uma biblioteca ou método nativo do
PySpark está disponível e relativamente simples de usar, devemos preferi-lo em
vez de uma biblioteca Python potencialmente não otimizada.

Usando o Delta Lake


Ao usar o Databricks, também podemos usar sua camada de armazenamento de
código aberto, Delta Lake. É um mecanismo de banco de dados que traz muitos
benefícios para o armazenamento de data lake. Aqui estão alguns deles:

 Transações ácidas: adiciona serializabilidade e um nível de isolamento a


leituras e gravações simultâneas de dados.
 Viagem no tempo e auditoria do histórico: adiciona instantâneos que
permitem a reversão para uma versão anterior dos dados. Isso é útil quando
queremos ver o que aconteceu com nossos dados. Com o motor Delta Lake,
podemos ver o estado dos dados a qualquer momento de sua história.
 Atualizações e exclusões: Normalmente, essas linguagens de
manipulação de dados (DMLs) são impossíveis com outras tecnologias de
big data. O motor Delta Lake suporta eles e até adiciona o
comando Merge sobre eles.
 Compatível com a API do Apache Spark: Pode ser usado no código de
dados existente do Spark sem muitas alterações.

Para obter uma lista completa de recursos, vá para a seguinte URL:

https://delta.io/

O motor Delta Lake tem os seguintes componentes:

 Bancos de dados: uma coleção de tabelas.


 Uma pasta de log: contém o histórico de alterações feitas nos dados da
tabela.
 Tabelas gerenciadas: tabelas gerenciadas significam que elas são
armazenadas no cluster dentro do Databricks. Os arquivos subjacentes não
são acessíveis, a menos que o cluster esteja ativo e em execução.
 Tabelas não gerenciadas: as tabelas são armazenadas no armazenamento
fora do cluster. Os arquivos subjacentes estão disponíveis, mas não podem
ser lidos tão facilmente, uma vez que não aplicamos as alterações dos
arquivos da pasta de log.
 Armazenamento: armazenamento de software livre que fica sobre o
armazenamento de data lake, como o Azure Data Lake Storage, o Amazon
S3 ou um armazenamento HDFS local.

Nesta receita, vamos salvar o nosso criado na receita anterior, Conectando-se a


uma fonte de dados da Internet, em uma tabela Delta. Criaremos um banco de
dados, adicionaremos os dados do DataFrame a uma tabela e mostraremos como
o histórico de auditoria pode ser usado.stateIncomeDF

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!

1. Adicione uma nova célula ao nosso bloco de anotações e digite o código a


seguir. Isso cria uma célula Markdown documentando que vamos jogar com
os componentes:Delta Lake
2. %md

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

O comando é usado para confirmar que o banco de dados foi criado:SHOW


DATABASES

%sql

CREATE DATABASE ETLInAzure;

SHOW DATABASES;
CopyExplain
4. A captura de tela a seguir mostra que o database foi criado:ETLInAzure

Figura 7.20 – Databricks criando banco de dados ETLInAzure

5. Em seguida, salvamos nosso DataFrame no armazenamento no


armazenamento de cluster. Digite o código a seguir em uma nova célula para
salvar o DataFrame. Primeiro, descartamos os arquivos caso houvesse uma
tentativa anterior de criar uma tabela nesse local:
6. dbutils.fs.rm("mnt/tables/stateIncome", True)

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

Figura 7.21 – Lista de Databricks de arquivos criados quando o DataFrame foi


salvo

9. Agora salvamos o conteúdo do nosso DataFrame no armazenamento no


cluster. Ainda não criamos uma tabela em cima dela. Para criar uma tabela
Delta usando um local específico, usaremos os comandos a seguir. A tabela
será uma tabela não gerenciada porque especificamos explicitamente o
armazenamento:
10. # Create a SQL table

11. # Ensure that the table is droppped or do not exists before

12. spark.sql("DROP TABLE IF EXISTS ETLInAzure.StateIncome")

13. # Create the table

spark.sql("CREATE TABLE ETLInAzure.StateIncome USING DELTA LOCATION

'/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

16. SELECT abbr


17.      , stateName

18.      , summedTotalIncomeAmount

FROM ETLInAzure.StateIncome
CopyExplain

Você deve obter uma lista como a seguinte captura de tela:

Figura 7.22 – Resultado da instrução Databricks SELECT

19. Agora, vamos inserir alguns dados em nossa tabela. Digite e execute o


seguinte comando SQL em uma nova célula do bloco de anotações:
20. %sql

21. INSERT INTO ETLInAzure.StateIncome

SELECT "ALL" AS abbr, "AllStates" AS StateName, 999999999 AS

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:

Figura 7.23 – DataFrame Databricks com linha anexada a ele

27. Emitimos agora duas inserções: uma implícita na criação da tabela e a


declaração. Vejamos o histórico da nossa tabela. Estamos usando a função
para isso. O primeiro parâmetro é uma faísca constante, o segundo é o
caminho da nossa tabela. Em seguida, dois DataFrames são criados – e :ALL
insertDeltaTable.forPath()fullHistoryDFcreateOperationDF
28. # Get Table changes

29. from delta.tables import *

30. deltaTable = DeltaTable.forPath(spark, '/mnt/tables/stateIncome')

31. fullHistoryDF = deltaTable.history()    # get the full history of the table


32. createOperationDF = deltaTable.history(0) # get the first operation

display(fullHistoryDF)
CopyExplain
33. O DataFrame contém todo o histórico, como mostrado na captura de tela de
following:fullHistoryDF

Figura 7.24 – Lista de alterações na tabela de Databricks

34. Para consultar a tabela antes de inserirmos a linha ALL, digite o seguinte


código em uma nova célula e execute-o:
35. tableCreatedDF = (spark.read

36.                   .format("delta")

37.                   .option("versionAsOf", 0)

38.                   .load("/mnt/tables/stateIncome").

39.                   orderBy("abbr")

40.                  )

display(tableCreatedDF)
CopyExplain

O resultado exibido deve ser como a seguinte captura de tela:


Figura 7.25 – Lista de linhas no armazenamento

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

Um novo modo de exibição temporário é criado. Ele é visível apenas pela


sessão do bloco de anotações. Ele não será persistido se desligarmos ou
reiniciarmos o cluster; terá de ser recriado se isso acontecer.

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

44. SELECT abbr, stateName, summedTotalIncomeAmount FROM ETLInAzure.StateIncome


45. EXCEPT

SELECT abbr, stateName, summedTotalIncomeAmount  FROM OriginalTable


CopyExplain

The result set shows that the only difference is the ALL abbr row as shown in
the following screenshot:

Figure 7.26 – Databricks row comparison

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

Delta Lake keeps a version of every change made to a table. A table is


represented by a directory in storage. This directory contains a subdirectory
called that contains all the change history. It would be very tedious to query a file
history without Delta Lake. _delta_log/

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:

 Precisamos ter um cluster em execução para consultar os dados. Isso pode


custar caro às vezes.

 As consultas levam mais tempo do que um banco de dados normal para


serem retornadas porque o cluster usa um processo distribuído: driver para
trabalhadores – especialmente para volumes pequenos.

 Não há segurança nativa em nível de linha ou mascaramento dinâmico de


dados como temos no SQL Server.

 Não há esquemas, apenas bancos de dados e tabelas. Isso pode ser um


problema para determinados aplicativos.

Nossa tabela contém apenas 52 linhas. Usamos o Databricks para importar os


dados da internet e armazená-los no Delta Lake. Para usá-lo em nosso banco de
dados aplicativo – copiaremos os dados transformados de volta para o SQL
Server.ETLInAzure.StateIncomeAdventureWorksLT

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!

1. Vamos usar outro notebook. Crie um novo bloco de anotações echame-o


como mostrado na captura de tela a seguir:ETLInAzureSQLServer

Figura 7.27 – Novo bloco de anotações Databricks para SQL Server

2. Agora, adicione uma célula Markdown usando o seguinte comando. Deixe as


linhas em branco entre a lista numerada:
3. %md

4. ### Insert data into SQL Server

5. 1- Create a JDBC connection string

6. 2- Connect to the database and overwrite it

3- Insert stateIncomeDF data


CopyExplain
7. Em seguida, verificaremos se o driver do nosso banco de dados está
presente no cluster. Desta vez, estamos usando a sintaxe Scala, já que a
funcionalidade não foi portada para outros idiomas. Adicione uma nova célula
ao bloco de anotações e digite e execute o seguinte código nele:
8. %scala
9. //Check if the driver exists

10. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

11. //You should get

res0: Class[_] = class com.microsoft.sqlserver.jdbc.SQLServerDriver


CopyExplain
12. Agora vamos adicionar alguns widgets ao notebook. Usaremos três widgets: ,
e . Dessa forma, se qualquer um desses parâmetros for alterado quando
chamamos o código de, por exemplo, Data Factory, não precisaremos abrir o
código para alterar uma dessas propriedades (certifique-se de que todos os
comandos estejam em uma única linha):ServerNameDatabaseNameServerPort
13. dbutils.widgets.removeAll()

14. dbutils.widgets.text("ServerName",  "etlinazurecookbook.database.windows.net", "Azure

SQL Server")

15. dbutils.widgets.text("DatabaseName", "AdventureWorksLT", "Azure SQL Database")

dbutils.widgets.text("ServerPort", "1433", "Azure SQL Server Port")


CopyExplain

Agora vemos os três widgets adicionados na parte superior do notebook,


conforme mostrado na captura de tela a seguir:

Figura 7.28 – Widgets do SQL Server Databricks adicionados

16. Em seguida, criamos a cadeia de conexão JDBC ou URL. Em uma nova


célula, digite o código a seguir e execute-o. Mude e para os seus.
Novamente, os comandos são divididos em várias linhas aqui para caber na
página do livro. É recomendável não digitar a senha em texto não
criptografado nos blocos de anotações. Em um ambiente de produção real,
usaríamos o Cofre de Chaves do Azure, conforme discutido no seguinte
artigo: https://docs.microsoft.com/en-us/azure/databricks/security/secrets/
secret-scopes#akv-ss:jdcbUserNamejdbcDBPassword
17. jdbcHostname = dbutils.widgets.get("ServerName")

18. jdbcDatabase = dbutils.widgets.get("DatabaseName")

19. jdbcPort = dbutils.widgets.get("ServerPort")

20. jdbcUserName= "<Your UserName>"

21. jdbcDBPassword = "<Your Password>"

jdbcUrl = "jdbc:sqlserver://{0}:

{1};database={2};user={3};password={4}".format(jdbcHostname, jdbcPort, jdbcDatabase,

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

24. stateIncomeJDBCDF = spark.table("ETLInAzure.StateIncome")

display(stateIncomeJDBCDF)
CopyExplain

Você deve obter o seguinte resultado em sua tela:


Figura 7.29 – Recuperação de dados da tabela Delta do Databricks em um
DataFrame

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(

27.   StateAbbreviation NVARCHAR(2) NOT NULL,

28.   StateName NVARCHAR(100) NOT NULL,

29.   StateIncome BIGINT NOT NULL,

30.   BatchID NVARCHAR(100)

)
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

Novamente, verifique se todos os comandos estão em uma linha, pois o


código a seguir pode ser dividido em várias linhas para acomodar o formato
do livro:

import json , time

notebook_info =

json.loads(dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson())

runid = notebook_info["currentRunId"]

if runid is None:

  runid = "InteractiveMode - " + str(round(time.monotonic() * 1000))


  

print(runid)
CopyExplain

O resultado deve ser semelhante a – .InteractiveMode5829221

O código usa o contexto do bloco de anotações para recuperar a ID de


execução. Essa ID de execução só é preenchida quando o bloco de
anotações é chamado de um processo externo, como o Data Factory ou outro
bloco de anotações. Quando estamos executando o código interativamente,
um valor é retornado. Nesse caso, ainda queremos um ID exclusivo. É por
isso que o prefixamos com – e atribuímos o tempo atual em
milissegundos. NoneInteractiveMode

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

stateIncomeJDBCDF = stateIncomeJDBCDF.withColumn("batchId", lit(str(runid)))


CopyExplain
34. Para salvar nosso no servidor, precisamos alinhar seus nomes de coluna à
tabela do SQL Server. Digite e execute o código a seguir em uma nova célula.
Estamos usando para renomear nossas colunas
DataFrame:stateIncomeJDBCDFwithColumnRenamed("old name", "new name")
35. stateIncomeJDBCDF  = (stateIncomeJDBCDF

36. .withColumnRenamed("abbr","StateAbbreviation")

37. .withColumnRenamed("stateName","StateName")

38. .withColumnRenamed("summedTotalIncomeAmount","StateIncome

39. ")

40. .withColumnRenamed("batchId", "BatchID")

41. )

display(stateIncomeJDBCDF)
CopyExplain

Obtemos a seguinte lista depois que o código termina de ser executado:

Figura 7.30 – Dados da tabela Delta do Databricks recuperados, coluna


renomeada e BatchID adicionado

42. Agora, vamos gravar o DataFrame em nossa tabela do SQL Server. Digite e


execute o seguinte código em uma nova célula:
43. (stateIncomeJDBCDF.write.format("jdbc")

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 \

50. FROM [SalesLT].[IncomesPerState] ) prd"

51. sqlServerDF = spark.read.jdbc(url=jdbcUrl, table=queryDF).orderBy("StateAbbreviation")

display(sqlServerDF)
CopyExplain

Obtemos uma lista como mostrado na captura de tela a seguir:

Figura 7.31 – Dados de Databricks recuperados do SQL Server

52. Agora, vamos contar o número de linhas. Em uma nova célula, digite e


execute o seguinte código:
sqlServerDF.count()
CopyExplain

Devemos obter .52

É isso! Escrevemos nossa tabela Delta no SQL Server.


Como funciona...
Nesta receita, usamos nossa tabela Delta criada na receita anterior, Usando o
Lago Delta, e inserimos seu conteúdo em uma tabela do SQL Server do Azure.
Conseguimos recuperar um ID de execução atual do bloco de anotações para
vincular os dados inseridos com o ID de execução específico do bloco de
anotações.

Java Database Connectivity (JDBC) é a chave aqui. Quase todos os bancos de


dados têm um driver JDBC disponível. Com ele, podemos ler e escrever a partir
de quase qualquer banco de dados. Juntamente com o fato de que o Databricks
pode ler quase qualquer armazenamento, isso o torna uma ferramenta de escolha
quando se trata de usar ETL na nuvem.

Capítulo 8: Estratégias de migração do


SSIS
Muitas empresas estão no processo de migração de algumas de suas soluções
locais do SQL Server Integration Services (SSIS) para a nuvem do Azure
atualmente. Há muitos Extract, Transform, Load (ETL) para migrar e a nuvem
pode representar um desafio nessa frente.

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.

Neste capítulo, abordaremos as seguintes receitas:

 Executando pacotes SSIS no ADF

 Reescrevendo um pacote SSIS usando o ADF

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.

Para executar o pacote SSIS no Azure, precisamos configurar algumas coisas:

 Crie um catálogo SSIS no Banco de Dados SQL do Azure.

 Implante pacotes SSIS nele.

 Execute pacotes SSIS.

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!

1. Primeiro criaremos um tempo de execução de integração SSIS em nossa


fábrica. Abra seu navegador e navegue até o portal do Azure.
2. Vá para a fábrica que criamos no Capítulo 6, ADF. Abra-o clicando em Autor
& Monitor.
3. Vá para a guia Gerenciamento e selecione Tempos de Execução de
Integração. Esse tempo de execução de integração do SSIS configurará um
catálogo do SSIS e iniciará máquinas virtuais (VMs) que executarão nossos
pacotes do SSIS. Clique em + Novo. Uma lâmina deve aparecer no lado
direito do seu navegador. Conforme mostrado na captura de tela a seguir,
selecione um tempo de execução de integração do Azure-SSIS e clique
em Continuar:

Figura 8.1 – Selecione um tempo de execução de integração Azure-SSIS

4. Defina Nome como SSIS-IR e Local para o local desejado. Defina


o tamanho do nó como o menor valor e o número do nó como 1.
Usaremos a licença padrão do SSIS. Se você tiver uma licença válida do SQL
Server, defina a opção Economizar dinheiro como Sim, conforme mostrado
na captura de tela a seguir. Clique em Continuar:
Figura 8.2 – Folha de configurações gerais do tempo de execução de
integração Azure-SSIS

5. A folha Configurações de implantação nos permite selecionar o banco


de dados do Azure onde queremos implantar nosso catálogo SSIS: , aquele
que criamos no Capítulo 2, Introdução ao ETL. Preencha as informações e
teste sua conexão. Clique em Continuar quando terminar:AdventureWorksLT
Figura 8.3 – Folha de configurações de implantação do tempo de execução
de integração Azure-SSIS

6. Na folha Configurações avançadas, deixe os valores padrão conforme


mostrado na captura de tela a seguir. Não executaremos muitos pacotes ao
mesmo tempo, então ter o máximo de execuções paralelas por nó como 2 é
OK, especialmente porque estamos optando por usar apenas um nó nas
configurações gerais. As outras três opções referem-se à instalação de um
componente de terceiros, integração em uma rede corporativa (VNet) e uso
de um proxy para dimensionar e proteger o tempo de execução integrado do
SSIS. Não estamos usando nenhuma dessas opções. Clique em Continuar:

Figura 8.4 – Folha Configurações avançadas do tempo de execução de


integração Azure-SSIS

7. Finalmente, a folha Resumo nos mostra as várias configurações que


definimos. Conforme destacado na captura de tela a seguir, podemos revisar
as configurações mais importantes e clicar em Criar para criar o tempo de
execução de integração do SSIS do Azure:
Figura 8.5 – Folha de resumo do tempo de execução de integração Azure-
SSIS

8. Creating the SSIS catalog and starting VMs can take up to 30 minutes. Once


created, you should see the following information in the Management tab:

Figure 8.6 – Azure-SSIS integration runtime running

9. Now that our catalog is ready, let's connect to it. Start SQL Server


Management Studio (SSMS). Type your Azure SQL Server name, and enter
the Login and Password information. Before connecting, click on Options as
shown in the following screenshot:

Figure 8.7 – Connect to the Azure SSIS catalog

10. As shown in the following screenshot, type SSISDB in the Connect to


database property and click on Connect:

Figure 8.8 – Connect to the Azure SSIS catalog

11. In SSMS Object Explorer, right-click on SSISDB under Integration Services


Catalogs and select Create Folder… from the submenu that appears, as
shown in the following screenshot. Type ETLInAzure as the folder name:
Figure 8.9 – Azure SSIS catalog – Create Folder

12. Once the folder is created, we can see it created as well as two subfolders, as
shown in the following screenshot:

Figure 8.10 – Azure SSIS catalog – folder created

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

15. On the Select Destination page, type your Azure SSIS catalog Server


name, Login, and Password details and click on Connect to connect to the
catalog. Once connected, select a path to deploy the packages as shown in
the following screenshot. Click Next:
Figure 8.12 – Deploy an SSIS project – Select Destination

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:

Figure 8.13 – Configure option

19. We want to configure the connection string of the on-premises connection


manager cmgr_ContonsoRetailDW to use a fully qualified server name. In
our case, the database sits on an Azure VM server, so we will
add <region>.cloudapp.database.net. This information can be found in
SSMS when you connect to your database: it's the server name. If you are
using an on-premises database server, you do not need to alter the
connection string. The connection string should look like the one shown in the
following screenshot:

Figure 8.14 – Configure the cmgr_ContonsoRetailDW connection string

20. By default, when we install SQL Server on a development machine,


the TCP/IP protocol is disabled. We are going to enable it. Open SQL Server
2019 Configuration Manager. As shown in the following screenshot, make
sure that the TCIP/IP protocol is enabled. If not, right-click on it and
select Enable:

Figure 8.15 – Configure the TCP/IP network protocol

21. Restart SQL Server Services to enable the TCP/IP protocol.

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:

Figure 8.16 – PigSSIS execution success

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

26. Most of these properties are selected via a drop-down list. Now, click


on Debug at the top of the pipeline to execute the pipeline in the debug
environment. After a while, the pipeline will be executed with success, as
shown in the following screenshot:
Figure 8.18 – Execute SSIS package success

27. Since the Azure-SSIS integration runtime is costly, we will now stop it as we're


finished with it. Go to the Management tab of the factory and click
on Integration runtimes to open its blade. As shown in the following
screenshot, stop the SSIS-IR integration runtime to Stop the VMs (nodes) that
execute our packages:

Figure 8.19 – Stop the SSIS-IR integration runtime

28. In a production scenario, we would start the Azure-SSIS integration runtime,


execute the SSIS packages, and stop the integration runtime when not used.
There is a template just for that scenario. Click on the Data Factory tab on the
left of your browser window. As shown in the following screenshot,
select Create pipeline from template:
Figure 8.20 – Create pipeline from template

29. From the blade that opens, select SSIS in the Filter pane. A template


called Schedule ADF pipeline to start and stop Azure-SSIS IR… is
displayed as shown in the following screenshot. Click on it:

Figure 8.21 – Select template


30. Another blade opens and asks us to select the Azure-SSIS integration
runtime. As shown in the following screenshot, select SSIS-IR and click
on Use this template:

Figure 8.22 – SSIS-IR template preparation

31. Once the pipeline is created, rename it Pipeline Start-Stop-Azure-SSIS IR


SSIS PIG. Set the Execute SSIS package activity name to PIG and its
properties as we did before, as shown in the following screenshot:

Figure 8.23 – SSIS-IR from the template

32. Now, for the web activity to be able to start and stop SSIS-IR, we need to


assign our factory as a contributor to itself. In the Azure portal, go to the
factory and select the Access Control (IAM) tab. Add a new role and assign
the factory as a contributor, as shown in the following screenshot. Click
on Save:

Figure 8.24 – Add a Contributor role to the factory

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:

Figure 8.25 – Pipeline executing

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.

Once we've created this integration runtime, it is possible to deploy packages to it.


We first connected to it in SSMS and created a folder for our project. We then
deployed the packages in it and executed them from ADF.

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.

Reescrevendo um pacote SSIS usando o


ADF
Da última receita, houve um pacote que não funcionou – . Isso ocorreu devido ao
fato de que um componente estava faltando na configuração básica do tempo de
execução de integração do SSIS: o Java Runtime
Environment (JRE). Poderíamos ter tentado instalá-lo, mas como o pacote é
bastante simples, vamos reescrevê-lo na data factory.HiveSSIS.dtsx

Temos várias opções:


 Ainda podemos usar o Hive no HDInsight para transformar os dados. Isso
seria rápido e seria a escolha certa se a lógica de transformação fosse
complexa e tivéssemos um prazo apertado. O ADF tem uma atividade do
Hive, bem como um conector de computação de cluster HDInsight. Então,
essa solução pode ser uma escolha válida. Mas há contras nisso, pois requer
tecnologia Hadoop que pode ser muito mais lenta do que o novo garoto no
bloco: Spark. Isso também dificulta a depuração, pois as mensagens de erro
do HDInsight às vezes podem ser complexas de analisar.

 Como a lógica do Hive é simples, podemos reescrevê-la usando um fluxo de


dados de mapeamento do ADF. Isso nos permitirá expor a lógica de
transformação usando transformações específicas e, portanto, facilitar a
manutenção, pois seria como se estivéssemos usando uma única tecnologia,
o ADF. Além disso, aproveitaríamos os clusters do Spark, que podem ser
transformações complexas mais rápidas, em comparação com o Hadoop.

Ambas as escolhas têm um obstáculo comum; Inserimos linhas em bancos de


dados locais. Do ponto de vista do Azure, não é automático. Mas o Data Factory
tem algo para isso: tempos de execução de integração auto-hospedados. Eles
permitem que o Data Factory acesse recursos locais usando um gateway especial
que permitirá que o ADF interaja com recursos locais de maneira segura.

Esta receita irá ensiná-lo a fazer o seguinte:

 Crie e configure um tempo de execução de integração auto-hospedado para


acessar um banco de dados local a partir do data factory.

 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

1. Abra o ETLInADF e vá para a guia Gerenciamento. Selecione Integration


Runtimes e clique em + New para abrir a folha Integration runtime setup
(Tempo de execução de integração). Conforme mostrado na captura de tela
a seguir, selecione Azure, Self-Hosted e clique em Continuar:

Figura 8.26 – Azure, painel de seleção auto-hospedado

2. A próxima folha nos pergunta se queremos criar um Azure ou SHIR (Self-


Hosted Integration Runtime) local. Observe que também há uma opção
para usar um SHIR existente. Como não criamos um SHIR até agora, vamos
selecionar a opção Self-Hosted conforme mostrado na captura de tela a
seguir. Clique em Continuar:
Figura 8.27 – Azure, seleção auto-hospedada

3. O nome do SHIR não é tão importante. No nosso caso, vamos nomeá-lo


usando o nome dos dados com os quais queremos trabalhar: Contonso Data
Warehouse. Como mostrado na captura de tela a seguir,
usaremos ContonsoDW para o nome. Clique em Criar:
Figura 8.28 – Nomeando o SHIR

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:

Figura 8.29 – Configuração do Express SHIR

5. O SHIR será baixado e instalado conforme mostrado na captura de tela a


seguir. Clique em Fechar depois de concluído:
Figura 8.30 – Configuração do Express SHIR concluída

6. Clicamos em Fechar na tela de configuração do SHIR, pois não


configuraremos nenhuma outra opção para esta receita.
7. Certifique-se de que o SHIR está funcionando conforme mostradon na
captura de tela a seguir:

Figura 8.31 – ADF SHIR em funcionamento

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

10. Na próxima folha, use LNK_ContonsoDW para Nome e selecione o serviço


vinculado ContonsoDW. Preencha as outras propriedades, conforme
mostrado na captura de tela a seguir. Clique em Testar conexão para garantir
que a conexão esteja funcionando e, em seguida, em Criar para criar o
serviço vinculado:
Figura 8.33 – Criação local do SQL Server do serviço vinculado ao ADF

11. Confirme se o serviço vinculado LNK_ContonsoDW é criado como shown na


captura de tela a seguir:

Figura 8.34 – Serviço vinculado ao ADF SQL Server local criado

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

14. Nomeie o conjunto de dados como FactSales e selecione


o LNK_ContonsoDW serviço vinculado. Deixe as propriedades Nome da
tabela e Importar esquema como Nenhuma, conforme mostrado na captura
de tela a seguir. Clique em Criar:
Figura 8.36 – Criação local do conjunto de dados do ADF SQL Server

15. De volta à atividade Copy_FactSales no pipeline,


selecione Consultar como consulta de uso e digite a seguinte instrução
SQL na caixa de texto Consulta:
16. SELECT   s.StoreName, s.ZipCode, d.FullDateLabel, f.UnitCost, f.UnitPrice,

f.SalesAmount, f.SalesQuantity, d.CalendarMonth

17. FROM     FactSales AS f INNER JOIN

18.          DimDate AS d ON f.DateKey = d.Datekey INNER JOIN

19.          DimStore AS s ON f.StoreKey = s.StoreKey

WHERE    (d.CalendarYear = 2009) AND (CAST(RIGHT(d.CalendarMonth, 2) AS int) < 6)


CopyExplain
20. Sua tela deve se parecer com a captura de tela a seguir. Você pode clicar
em Visualizar dados para ver uma amostra dos dados retornados pela
consulta e testar se as conexões estão funcionando corretamente:
Figura 8.37 – Visualização do código-fonte da atividade de cópia 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:

Figura 8.38 – Conjunto de dados do coletor de atividade de cópia do ADF

22. De volta à atividade Copy_FactSales, clique na guia Mapeamento e importe


os esquemas. Agora você deve ver o esquema importado conforme mostrado
na captura de tela a seguir:
Figura 8.39 – Mapeamentos de atividade de cópia do ADF importados

23. Agora, vamos copiar os dados. Clique em Depurar para testar nossa


atividade de cópia. Após alguns segundos, os dados devem ser copiados
para a conta de armazenamento, conforme mostrado na captura de tela a
seguir:

Figura 8.40 – Execução bem-sucedida da atividade de cópia do ADF

24. Agora, vamos adicionar uma atividade de Fluxo de Dados ao pipeline.


Selecione Mapeando Fluxo de Dados e nomeie-o DFT_SalesAgg. Clique
em Adicionar Origem, nomeie-o como FactSalesParquet e selecione
FactSalesParquet como o conjunto de dados. Você deve ter uma tela como
a seguinte captura de tela:
Figura 8.41 – Configurações de origem do ADF DFT

25. Verifique se a opção Depuração de fluxo de dados está em execução na


parte superior da fábrica, conforme mostrado na captura de tela a seguir. Se o
depurador não estiver em execução, inicie-o. Pode levar vários minutos para
começar:

Figura 8.42 – Depuração de fluxo de dados do ADF DFT em execução

26. Vá para a guia Projeção e clique em Importar projeção, conforme mostrado


na captura de tela a seguir:
Figura 8.43 – Colunas de projeção de origem do ADF DFT

27. Agora, clicando no sinal + no canto inferior direito de FactSalesParquet,


adicione uma transformação Agregada. Nomeie-o AGGFactSales. Adicione
as seguintes colunas na seção Agrupar
por – StoreName, ZipCode e CalendarMonth – conforme mostrado na
captura de tela a seguir:

Figura 8.44 – Agregado ADF DFT Grupo por colunas

28. Clique no botão Agregar. Vamos agregar algumas colunas aqui.


Selecione UnitCost na primeira célula à esquerda. Clique na célula à direita
para abrir o construtor de expressões visuais. Conforme mostrado na
captura de tela a seguir, digite em EXPRESSION FOR FIELD
"UNITCOST". Clique em Salvar e concluir para salvar
a expressão:avg(UnitCost)

Figura 8.45 – Agregado ADF DFT, o construtor de expressões visuais

29. Use a função média para as colunas UnitCost e UnitPrice. Use a função de


soma para as colunas SalesAmount e SalesQuantity conforme mostrado na
captura de tela a seguir:
Figura 8.45a – Colunas agregadas do ADF DFT

30. Clique em qualquer lugar no plano de fundo do fluxo de dados. Clique


em Parâmetros na parte inferior da tela. Adicione um parâmetro
chamado pipeLineRunID e defina seu valor padrão como "000", conforme
mostrado na captura de tela a seguir:

Figura 8.46 – Parâmetro pipeLineRunID do ADF DFT

31. Adicione uma coluna Derivada após a transformação AGGFactSales.


Adicione uma coluna chamada pipeLineRunID e use o parâmetro que
acabamos de adicionar na Etapa 26 – conforme mostrado na captura de tela
a seguir. Chame a transformação de coluna derivada DERpipeLineRunID:
Figura 8.47 – Coluna derivada do ADF DFT para o parâmetro pipeLineRunID

32. Em seguida, adicione um coletor e nomeie-o SalesPerMonth. Adicione um


novo conjunto de dados com base na conta de armazenamento do Azure e
use o formato de arquivo Parquet. Nomeie-o SalesPerMonth e defina o
caminho do arquivo como adf/salesPerMonth. Não insira nenhum nome de
arquivo conforme mostrado na captura de tela a seguir:

Figura 8.48 – Conjunto de dados do coletor de DFT do ADF

33. Deixe a propriedade Allow schema drift marcada, pois ainda não temos um


esquema importado. O lava-loiça deve ter a seguinte captura de tela:
Figura 8.49 – Dissipador de DFT do ADF

34. Clique na guia Configurações. Defina as propriedades conforme mostrado


na captura de tela a seguir. Selecione Saída para arquivo único e defina o
nome do arquivo como SalesPerMonth.parquet. Você receberá um aviso de
que precisamos alterar a configuração da partição de saída:

Figura 8.50 – Configurações do coletor de DFT do ADF

35. Clique na guia Otimizar e selecione Partição única. Isso vai se livrar do erro


que tivemos com a guia Configurações.
36. Volte para o pipeline. Vincule a atividade de fluxo de dados DFT_SalesAgg à
atividade Copy_FactSales. Clique em Parâmetros, escolha Expressão
de pipeline e adicione o pipeline(). Parâmetro de pipeline RunId das
variáveis do sistema, conforme mostrado na captura de tela a seguir:
Figura 8.51 – ADF DFT adiciona o parâmetro

37. Agora, execute o pipeline clicando no botão Depurar na parte superior do


data factory. O pipeline será executado com êxito. Vá para sua conta de
armazenamento para validar se o arquivo foi produzido conforme mostrado na
captura de tela a seguir:

Figura 8.52 – Arquivo ADF DFT SalesPerMonth criado

38. A visualização da execução detalhada do fluxo de dados (passe o mouse


sobre DFT_SalesAgg na saída da execução e clique no ícone de óculos)
mostrará as seguintes informações. Lemos 358k linhas e
agregamos 1505 linhas na pia:

Figura 8.53 – Detalhes de execução do ADF DFT SalesPerMonth

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:

Figura 8.54 – Guia ADF Copy_dbo_SalesAgg origem

42. Vá para a guia Pia . Crie um conjunto de dados do SQL Server


chamado .dbo_SalesAgg
43. Digite o seguinte comando SQL na caixa de texto Script de pré-cópia:
TRUNCATE TABLE [dbo].[SalesAgg]
CopyExplain
44. Vá para a guia Mapeamento. Clique em Importar esquemas. Defina o
mapeamento da coluna como o da captura de tela a seguir.
Mapeie pipeLineRunID para a coluna BatchID:

Figura 8.55 – Guia Mapeamento do Copy_dbo_SalesAgg do ADF

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:

Figura 8.56 – Pipeline do ADF concluído e executado com êxito

46. Agora, vá para o SSMS e execute a seguinte consulta:


47. SELECT [storename]
48.       ,[zipcode]

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:

Figura 8.57 – Resultado da execução do pipeline do ADF

57. Agora, fizemos muitas mudanças na fábrica. Salve as alterações publicando-


as. Clique em Publicar tudo na parte superior da fábrica para publicar as
alterações fora do ambiente de área restrita.

É isso! Nós reescrevemos nosso pacote no ADF! HiveSSIS

Nosso pacote resultou em um pipeline mais rápido no Data Factory e, agora, o


fluxo de dados de mapeamento é semelhante aos fluxos de dados do
SSIS. HiveSSIS

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.

Capítulo 9: Definindo a criação de perfil


de dados no Azure
A criação de perfil de dados é uma parte importante de cada projeto de dados. Ele
ajuda o modelador de dados a criar um modelo de dados preciso e informa aos
desenvolvedores de ETL que tipo de dados temos e quão limpos os dados são.
Ela também ditará as várias transformações que devemos aplicar a ela.

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:

Figura 9.1 – Uma visão geral do processo de criação de perfil de dados


Este capítulo se concentrará na etapa de dados de criação de perfil mostrada no
diagrama anterior. Aqui, você aprenderá técnicas comuns para obter a criação de
perfil de dados.

Neste capítulo, abordaremos as seguintes receitas:

 Usando o SQL no Spark

 Usando funções internas do Spark

 Usando a criação de perfil de pandas

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.

Usando o SQL no Spark


Usar o Spark SQL para criar perfis de dados é útil quando queremos fazer a
criação de perfil de dados básicos ou quando queremos explorar um aspecto
específico do nosso conjunto de dados de origem. Esta receita irá ensinar-lhe
algumas técnicas para obter alguns relatórios de criação de perfil de dados
rápidos e sujos. Usaremos um conjunto de dados aberto no formato CSV,
carregaremos no DataFrame e usaremos o SQL para executar algumas consultas
de criação de perfil diretas.

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:

1. No navegador da Web, vá para o portal do Azure em https://portal.azure.com/,


vá para o grupo de recursos e, a partir daí, inicie o espaço de trabalho do
Azure Databricks que você criou no Capítulo 7, Azure
Databricks.ETLInAzureCookBook
2. Clique em Novo Bloco de Anotações na página inicial do Databricks. Um
formulário Criar Bloco de Anotações será exibido.

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

3. O bloco de anotações será aberto com uma célula (Cmd 1) onde


começaremos a escrever código.DataProfiling
4. Para se conectar ao arquivo CSV na Internet
em https://www.irs.gov/statistics/soi-tax-stats-individual-income-tax-statistics-
2017-zip-code-data-soi, adicione o seguinte código na célula de
comando Cmd 1:
5. dbutils.widgets.text("urlStateData", "https://www.irs.gov/pub/irs-soi/17zpallnoagi.csv", "State

Income Data URL")

urlStateData = dbutils.widgets.get('urlStateData')
CopyExplain

Ao copiar o código para o bloco de anotações, verifique se o comando está


todo em uma linha, conforme mostrado na captura de tela da Etapa 5.dbutils

6. Passe o mouse sob a célula de comando Cmd 1 e um pequeno botão com


um ícone + aparecerá. Clique nele para adicionar uma nova célula ao bloco
de anotações, conforme mostrado na captura de tela a seguir:

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

10. # Display the dataframe

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:

Figura 9.5 – Uma captura de tela mostrando o DataFrame exibido

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,

17. COUNT(DISTINCT STATE) AS State, COUNT(DISTINCT ZIPCODE) AS ZipCode,

18. COUNT(DISTINCT AGI_STUB) AS AdjustedgrossIncome,

19. COUNT(DISTINCT MARS4) AS HeadofHouseholdReturns,

20. COUNT(DISTINCT A02650) AS TotalIncomeAmount

21. FROM StateData

22. UNION

23. SELECT 'MAXIMUM' AS RowValue,

24. MAX(STATE) AS State, MAX(ZIPCODE) AS ZipCode,

25. MAX(AGI_STUB) AS AdjustedgrossIncome,

26. MAX(MARS4) AS HeadofHouseholdReturns,

27. MAX(A02650) AS TotalIncomeAmount

28. FROM StateData

29. UNION

30. SELECT 'MINIMUM' AS RowValue,

31. MIN(STATE) AS State, MIN(ZIPCODE) AS ZipCode,

32. MIN(AGI_STUB) AS AdjustedgrossIncome,

33. MIN(MARS4) AS HeadofHouseholdReturns,

34. MIN(A02650) AS TotalIncomeAmount

FROM StateData
CopyExplain

Nesta etapa, estamos usando o código SQL para fazer a criação de perfil de


dados básicos no conjunto de dados.

35. Execute ambas as células clicando no ícone Executar célula correspondente


no canto superior direito da célula para ver os resultados mostrados na
captura de tela a seguir:
Figura 9.6 – Uma captura de tela mostrando como executar um novo bloco de
anotações Databricks

Este é o resultado da consulta SQL nos dados recuperados do arquivo CSV


onde perfilamos manualmente os dados no Databricks.

36. Agora, vamos um pouco mais longe. Verificaremos o comprimento máximo


das colunas de cadeia de caracteres. Adicione uma nova célula ao bloco de
anotações e digite o seguinte trecho de código:
37. %sql

38. SELECT 'MAX LENGTH STATE' AS RowValue,

39. MAX(length(STATE))

40. FROM StateData

41. UNION ALL

42. SELECT 'MAX LENGTH ZIPCODE' AS RowValue,

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

45. Por fim, vamos contar se temos valores no subconjunto das colunas. Adicione


uma nova célula e digite o seguinte trecho de código:NULL
46. %sql

47. SELECT

48. SUM(CASE WHEN STATE IS NULL THEN 1 ELSE 0 END) AS ZIPCodeIsNULL,

49. SUM(CASE WHEN ZIPCODE IS NULL THEN 1 ELSE 0 END) AS ZIPCodeIsNULL,

50. SUM(CASE WHEN AGI_STUB IS NULL THEN 1 ELSE 0 END) AS

AdjustedgrossIsIncomeNULL,

51. SUM(CASE WHEN MARS4 IS NULL THEN 1 ELSE 0 END) AS

HeadofHouseholdReturnsIsNULL,

52. SUM(CASE WHEN A02650 IS NULL THEN 1 ELSE 0 END) AS

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:

Figura 9.8 – Uma captura de tela mostrando contagens de valores NULL

Vamos para a próxima seção!


Como funciona...
Nesta receita, realizamos o perfil de dados básicos manualmente. Carregamos
dados de estatísticas governamentais abertas do arquivo CSV no DataFrame e
criamos uma exibição temporária que poderíamos consultar usando SQL. Neste
ponto, usamos SQL para obter os valores , e de cada coluna, então exibimos o
comprimento das colunas de cadeia de caracteres e verificamos a anulabilidade
de cada coluna. Esses são os dados básicos de criação de perfil que podem nos
ajudar a entender a natureza dos dados que estamos
recebendo. DISTINCTMINMAXMAX

A criação de perfil de dados manualmente às vezes requer muitas etapas e pode


ser demorada. A vantagem de fazer isso é que você pode personalizar o perfil que
deseja alcançar e atender aos objetivos do seu projeto em termos de análise de
dados.

Usando funções internas do Spark


O Spark tem funções integradas que podem ser usadas para aumentar a criação
de perfis manuais. Ele pode substituir algumas consultas manuais de criação de
perfil de dados. Esta receita ensinará sobre duas funções internas básicas que,
quando usadas em conjunto com a criação manual de perfis, fornecem
informações úteis para modeladores de dados e cientistas de dados. Nesta
receita, usaremos o DataFrame criado na primeira receita e chamaremos as
funções internas do Spark.

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:

1. No navegador da Web, vá para o portal do Azure


em https://portal.azure.com/ e, a partir daí, inicie o espaço de trabalho do
Azure Databricks.
2. Na home page do Databricks, você pode abrir o bloco de anotações clicando
no nome do bloco de anotações DataProfiling em Recentes.DataProfiling
3. Vejamos a funcionalidade com SQL. Adicione uma nova célula de comando
clicando no ícone + abaixo da última célula. Na nova célula, adicione o
seguinte código:describe
4. %sql

describe formatted StateData


CopyExplain
5. Clique no ícone Executar célula no canto superior direito da célula para
executar o código e ver os resultados, conforme mostrado na captura de tela
a seguir:
Figura 9.9 – Uma captura de tela mostrando como executar um novo bloco de
anotações Databricks

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:

Figura 9.10 – Uma captura de tela mostrando como salvar um resultado de


célula de bloco de anotações Databricks
7. Agora podemos tentar a função, que poderia nos dar informações úteis sobre
nossos dados. Adicione uma nova célula de comando clicando no
ícone + abaixo da última célula. Na nova célula, adicione o seguinte código
para examinar o esquema derivado para o arquivo CSV:printSchema()
stateDataDF.printSchema()
CopyExplain
8. Você deve clicar em Executar célula para ver os resultados. Eles
são mostrados na captura de tela a seguir para sua referência:

Figura 9.11 – Uma captura de tela mostrando o resultado printSchema() da


célula do bloco de anotações Databricks

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:

Figura 9.12 – Uma captura de tela mostrando o resultado do Databricks notebook


PySpark describe()

Agora vamos para a próxima seção, onde vamos recapitular.

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

O uso de funções internas do Databricks pode ser suficiente para a criação de


perfil básica. No entanto, as funções internas não são suficientes para entender os
dados completamente. Geralmente usamos uma mistura de funções internas
simples e preenchemos as lacunas com a criação manual de perfis.
Usando a criação de perfil de pandas
A criação de perfil do Pandas é uma biblioteca comum usada para criar dados de
perfil. Ele vai além de tudo o que fizemos até agora e produz um relatório HTML
que contém informações valiosas tanto para o cientista de dados quanto para o
modelador de dados. Esta receita irá ensiná-lo a instalar e usar o perfil de pandas.
Nesta receita, usaremos o DataFrame inicializado na primeira receita e usaremos
a biblioteca de criação de perfil de pandas para mostrar os relatórios de criação de
perfil de dados visuais avançados que podem ser obtidos com ele.

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

1. Clique no ícone Clusters no menu do lado esquerdo para ir para a


página Clusters.
2. Na lista de clusters interativos, selecione e, se não estiver em execução,
inicie-o clicando no botão Iniciar. ETLInAzureCluster
3. Se ETLInAzureCluster estiver em execução, vá para a guia Bibliotecas,
conforme mostrado na captura de tela daasa seguinte:
Figura 9.13 – Uma captura de tela mostrando a instalação da biblioteca de
cluster Databricks

4. Clique no botão Instalar novo. Selecione PyPI como Fonte da Biblioteca e


entre em Pacote, conforme mostrado na captura de tela a seguir. Clique
em Instalar.pandas_profiling
5. Após a instalação bem-sucedida, você verá que a
biblioteca pandas_profiling tem um status Instalado:
Figura 9.14 – Uma captura de tela mostrando a seleção da biblioteca de
cluster do Databricks

6. Agora podemos prosseguir com a codificação. Abra o bloco de


anotações.DataProfiling
7. Nesta etapa, criaremos um DataFrame de pandas a partir do DataFrame do
Spark e selecionaremos nossas cinco colunas para criação de perfil.

Adicione o seguinte código na nova célula de comando para fazer isso:

from pyspark.sql.functions import col

import pandas_profiling

# Choose 5 columns

pdf = stateDataDF.select(col("STATE"), col("ZIPCODE"), col("AGI_STUB"), col("MARS4"),

col("A02650")).toPandas()

# Create a profiling IPython.core.display variable

prof = pandas_profiling.ProfileReport(pdf,title='State Income for 2017 Profiling Report')


CopyExplain

Ao copiar o código para o bloco de anotações, verifique se a última linha do


comando está toda em uma linha.

8. Clique em Executar célula para executar o código na célula de comando.


9. Vamos converter nossos dados de criação de perfil para o formato HTML
agora. Você pode fazer isso adicionando o seguinte código na nova célula de
comando:
displayProfile = prof.to_html()
CopyExplain
10. Clique em Executar célula para executar a conversão.
11. Agora adicione uma nova célula de comando com o seguinte código:
displayHTML(displayProfile)
CopyExplain
12. Clique em Executar célula para produzir o relatório. Dê uma olhada na
captura de tela a seguir para ver a seção Visão geral do resultado:
Figura 9.15 – Uma captura de tela mostrando a visão geral do relatório de
criação de perfil dos pandas

Cada coluna é detalhada na seção Variáveis, conforme mostrado na captura


de tela a seguir:
Figura 9.16 – Uma captura de tela mostrando a visão geral das variáveis de
criação de perfil dos pandas

Veja como vemos claramente um problema com a coluna AGI_STUB,


mostrada na captura de tela a seguir:
Figura 9.17 – Uma captura de tela mostrando um aviso de variável de criação
de perfil de pandas

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

A captura de tela a seguir mostra a seção Interações do relatório de criação


de perfil:
Figura 9.19 – Uma captura de tela mostrando a interação do CEP dos pandas

Há também uma seção Valores ausentes no relatório, mostrada na captura


de tela a seguir:
Figura 9.20 – Uma captura de tela mostrando os valores ausentes das
variáveis de criação de perfil dos pandas

E, por último, podemos ter uma ideia dos próprios dados da


seção Amostra do relatório, mostrada na captura de tela a seguir:
Figura 9.21 – Uma captura de tela mostrando os valores de amostra de
criação de perfil dos pandas

13. Vamos salvar os resultados da criação de perfil de dados em nosso


armazenamento. Copie a chave de acesso exclusiva da conta de
armazenamento. Para obter a Chave de Acesso, vá para a página Conta de
armazenamento no portal do Azure, vá para a guia Chaves de acesso e
copie a Chave de lá, conforme mostrado na captura de tela a seguir:

Figura 9.22 – Uma captura de tela mostrando o acesso à chave da conta de


armazenamento do Azure

14. Enquanto ainda estamos na página Conta de armazenamento, vá


para Contêineres e crie um novo contêiner de criação de perfil clicando no
link + Contêiner. Você verá seu contêiner de criação de perfil depois de
criá-lo, conforme mostrado na captura de tela a seguir:
Figura 9.23 – Uma captura de tela mostrando o contêiner de criação de perfil
na conta de armazenamento

15. Adicione o seguinte código à nova célula de comando. Coloque a chave de


acesso copiada na variável, substituindo o espaço reservado entre aspas
duplas no código a seguir:storage_account_access_keyxxx
16. storage_account_name = "etlinazure"

17. storage_account_access_key = "xxx"

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"

19. Clique em Executar célula para executar o comando. Agora, adicione uma


nova célula de comando e coloque o seguinte código dentro para preparar o
local de saída para o relatório:
20. outputFilePath = "wasbs://profiling@etlinazure.blob.core.windows.net/ProfileReport.html"
dbutils.fs.put(outputFilePath, prof.to_html(), overwrite=True)
CopyExplain

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

21. Clique em Executar célula para executar o comando. Agora vamos usar a


função para ver se o arquivo foi copiado para o armazenamento. Adicione
uma nova célula de comando com o seguinte código para fazer isso:display()
22. display(

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:

Figura 9.24 – Uma captura de tela mostrando o conteúdo de armazenamento


do Azure

25. Se você acessar a conta de armazenamento, poderá baixar e abrir o arquivo


HTML que contém o relatório de criação de perfil de dados, conforme
mostrado na captura de tela a seguir:
Figura 9.25 – Uma captura de tela mostrando o relatório de criação de perfil salvo
na conta de armazenamento do Azure

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.

Instalamos a biblioteca no cluster Databricks e geramos dados de criação de perfil


no DataFrame. Depois disso, convertemos os dados de criação de perfil em
formato HTML para visualizar os relatórios. Os relatórios HTML produzidos pela
criação de perfil de pandas mostram diferentes aspectos dos dados em um
formato visual. Também mostramos como salvar relatórios de criação de perfil de
dados em uma conta de armazenamento, para que eles possam ser
compartilhados com outras pessoas ou arquivados.pandas_profiling

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.

A transformação de dados é basicamente um mapeamento de colunas entre


conjuntos de dados de origem e de destino e agregações com valores. Isso leva
muito tempo, pois os dados nunca são precisos o suficiente para serem usados
como estão. Ele também não pode ser importado, a menos que saibamos com
quais tipos de dados estamos lidando.

Anos atrás, importávamos o conjunto de dados de origem para um banco de


dados e perfil de lá. Sempre enfrentamos alguns desafios para encontrar o tipo de
dados certo, então geralmente acabamos usando tipos de dados de caracteres na
maioria das vezes. Também não pudemos analisar todo o conjunto de dados, pois
muitas vezes era um esforço tedioso para o mecanismo de banco de dados
consultar conjuntos de dados muito grandes com conversão de coluna de
caractere para outros tipos 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.

Capítulo 10: Gerenciar o SSIS e o Azure


Data Factory com o Biml
Muitos desenvolvedores concordarão, eu acho, que uma das coisas mais difíceis
de suportar no trabalho não é resolver problemas complexos ou correr para
cumprir um prazo, mas o tédio. O tédio de tarefas pouco inspiradoras, a falta de
um desafio intelectual e a repetição do mesmo código, da mesma lógica e dos
mesmos nomes de campo repetidamente. Vamos tomar o desenvolvimento de
pacotes SSIS como exemplo: muitas tarefas de desenvolvimento SSIS podem
parecer repetitivas e chatas porque os mesmos padrões se aplicam a vários
pacotes, e nós apenas mudamos os nomes das tabelas e o conjunto de colunas
de pacote para pacote.

É por isso que estou emocionado em apresentar Biml neste livro! Biml significa


Business Intelligence Markup Language (Linguagem de Marcação de Business
Intelligence) e faz o que eu sempre desejei – gera pacotes SSIS com base no
padrão que você projeta.

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

 Gerando instruções T-SQL select para todas as tabelas

 Gerando T-SQL para descartar e criar todos os índices

 Gerando um pacote SSIS básico

 Gerando um pacote SSIS com tarefas Executar SQL

 Usando Converter pacote SSIS em Biml

 Gerando uma alteração em massa nos procedimentos armazenados

 Gerando um pacote SSIS contendo uma tarefa de fluxo de dados

 Gerando seu primeiro Azure Data Factory

 Carregando vários arquivos usando o Data Factory


Requisitos técnicos
O Visual Studio 2019 e uma instância do Microsoft SQL Server já devem estar
instalados no computador. O Visual Studio 2019 Community é uma versão gratuita
e pode ser baixado do https://tinyurl.com/y5tuzs2y. A instalação do Visual Studio
2019 e do Microsoft SQL Server foi abordada no Capítulo 1, Introdução ao SSIS
2019. BimlExpress 2019, que é gratuito, tem que ser instalado usando este
link: https://www.varigence.com/bimlexpress. O que precisamos preparar para este
capítulo são dois bancos de dados de exemplo – e – e um projeto SSIS importado:
. Vamos analisar a instalação do projeto SSIS de amostra em nossa primeira
receita.WideWorldImportersWideWorldImportersDWDaily.ETL.ispac

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

Figura 10.1 – Uma captura de tela mostrando o Assistente de Importação de


Projeto do Integration Services

5. Clique em Avançar. Em seguida, clique em Importar. Após uma importação


bem-sucedida, todas as ações de importação terão ícones verdes de
sucesso e você pode clicar no botão Fechar.
6. O projeto ETLInAzure SSIS será aberto, conforme mostrado na captura de
tela a seguir:
Figura 10.2 – Uma captura de tela mostrando o projeto ETLInAzure SSIS

O projeto aberto conterá um único pacote SSIS chamado .DailyETLMain.dtsx

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

Gerando instruções T-SQL select para


todas as tabelas
Vamos começar com o exemplo mais simples e demonstrativo – gerar uma
instrução T-SQL. Biml tem acesso a um tesouro de metadados ou informações de
banco de dados, como nomes de tabelas, nomes de esquemas, nomes de
colunas, chaves estrangeiras, índices e muito mais. Tendo esses dados valiosos,
podemos fazer muitas e muitas coisas úteis! Veremos como podemos gerar uma
lista de instruções select para cada tabela em um banco de dados que conta o
número de linhas de cada tabela.

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

Isso adicionará um novo arquivo chamado na pasta do projeto. Renomeie-o


para e reabra-o. Inicialmente, ele conterá apenas as tags de abertura e
fechamento do elemento raiz Biml. BimlScript.bimlMiscellaneousRecipe1.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=

4. SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;");

var sourceMetadata = sourceConnection.GetDatabaseSchema();


CopyExplain
5. Em um loop, percorra cada tabela e gere a instrução T-SQL para contar cada
linha na tabela. Adicione o seguinte código ao bloco de controle:foreach
6. foreach (var table in sourceMetadata.TableNodes) {#>
7. SELECT COUNT(1) FROM [<#=table.Schema#>].[<#=table.Name#>]

<#}#>
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:

Figura 10.4 – Uma captura de tela mostrando o código T-SQL gerado

O modo de exibição de arquivo no Visual Studio geralmente é dividido em duas


partes. A parte superior é a parte de código Biml, e a parte inferior é a parte de
visualização onde você pode dar uma olhada no que o script está produzindo
depois de compilado.BimlScript

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

O arquivo que criamos nesta receita consiste em duas partes: um bloco de texto e


um bloco de controle. O bloco de texto aqui contém a instrução T-SQL e o
bloco Control é uma pepita de código BimlScript que contém lógica dizendo ao
mecanismo Biml como colocar todos os blocos de construção juntos para produzir
um ativo de business intelligence (BI) completo. BimlScriptSELECT * FROM

No passo 2 desta receita, costumamos sinalizar o início do bloco de controle. Os


blocos de controle podem ser gravados em qualquer um ou ; usaremos apenas C#
em nossas receitas. <#VBC#

Na etapa 3, utilizou-se após o braquete do para sinalizar o final do bloco de


controle. #>foreach loop

<#= e são usados para indicar um bloco de expressão que fornece acesso a um


valor compilado e, em nosso exemplo, ele está fornecendo os valores do esquema
de tabela e do nome da tabela que são necessários para a instrução select. #>

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<#= #>

Os blocos de expressão também podem ser usados para fins de depuração


quando você deseja ver a que exatamente o código tem acesso.
Gerando T-SQL para descartar e criar
todos os índices
Nesta segunda receita, demonstraremos outro superpoder baseado em
metadados Biml. Às vezes, você precisará descartar todos os índices da tabela e,
em seguida, recriá-los. Em vez de fazer isso por meio de SQL dinâmico, você
pode fazê-lo mais rápido com o Biml, porque ele fornece instruções SQL
completas. Vamos gerar instruções SQL para descartar e criar índices para cada
tabela.

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.

1. Adicione um novo arquivo BimlScript à sua solução. Renomeie-o para . Deve


conter apenas etiquetas Biml de abertura e fechamento.Recipe2.biml
2. Adicione o seguinte código entre as marcas Biml para configurar uma
conexão de banco de dados e obter os metadados do banco de dados
usando o método: GetDatabaseSchema()
3. <# var sourceConnection = SchemaManager.CreateConnectionNode("Destination", @"Data

Source=ETLInAzureBook\MSSQL2019; Initial Catalog=WideWorldImportersDW;

Provider=SQLNCLI11.1; Integrated Security=SSPI; Auto Translate=False;");

var sourceMetadata = sourceConnection.GetDatabaseSchema();


CopyExplain
4. Em um loop, percorra cada tabela e gere a instrução T-SQL para soltar e criar
índices em cada tabela. Adicione o código mostrado no seguinte trecho para
fazer isso:foreach
5. foreach(var table in sourceMetadata.TableNodes) {

6. foreach(var key in table.Indexes) {

7. #>

8. <#=key.GetDropAndCreateDdl()#>

<#}}#>
CopyExplain

Aqui, temos dois loops. O loop externo entra em cada definição de tabela, e o


loop interno passa por cada índice e recupera uma instrução e para
ele.dropcreate

9. Clique em Salvar. No canto inferior direito do painel de visualização, clique


em Atualizar. Você deve ver o código T-SQL gerado, conforme mostrado na
captura de tela a seguir:

Figura 10.5 – Uma captura de tela mostrando o código T-SQL gerado


O T-SQL gerado no painel de visualização agora pode ser copiado e colado
no Microsoft SQL Server Management Studio (SSMS) e executado, depois de
remover a primeira e a última linhas que contêm marcas de abertura e
fechamento.Biml

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

Gerando um pacote SSIS básico


Agora estamos prontos para acessar os pacotes SSIS. Vamos começar com um
pacote SSIS que é semelhante a um pacote mestre, porque esse tipo de pacote é
mais adequado para automação. Os pacotes mestre geralmente são simples e
chamam outros pacotes de maneira linear. Usaremos um projeto SSIS de amostra
da Wide World Importers para esta receita. No projeto de exemplo Wide World
Importers é um único pacote e contém um conjunto de para cada tabela de
destino. Cada sequência tem mais lógica. Tudo o que queremos fazer nesta
receita é gerar um pacote SSIS com uma coleção de vazios para cada tabela de
destino. DailyETLMain.dtsxSequencesSequence Containers

Preparando-se
Há alguns passos que precisamos tomar antes de começar:

1. Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.


Primeiro, precisaremos preparar nossa força motriz: os metadados. Você
precisará criar um novo banco de dados do SQL Server, , onde os metadados
e a configuração para este projeto residirão.BIMLMetadata
2. Abra o Microsoft SQL Server Management Studio (SSMS) e conecte-se
ao SQL Server . Abra a janela Nova consulta e execute a seguinte instrução
T-SQL para criar o banco de dados de metadados:ETLInAzureBook\MSSQL2019
CREATE DATABASE [BIMLmetadata]
CopyExplain
3. Crie uma única tabela, , no banco de dados. Armazenaremos nomes de
tabelas e outras informações úteis nele. Abra a janela Nova consulta e
execute a seguinte instrução:TableConfigBIMLMetadataCREATE TABLE
4. CREATE TABLE [dbo].[TableConfig](

5. [TableType] [nvarchar](50) NULL,

6. [SchemaName] [nvarchar](256) NULL,

7. [TableName] [nvarchar](256) NULL,

8. [StagingTableName] [nvarchar](256) NULL,

9. [GetStoredProc] [nvarchar](256) NULL,

10. [MigrateStoredProc] [nvarchar](256) NULL,

11. [TableOrder] [int] NULL

) 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'City_Staging', N'GetCityUpdates', N'MigrateStagedCityData', 1),

14. (N'Dimension', N'Dimension', N'Customer', N'Customer_Staging', N'GetCustomerUpdates',

N'MigrateStagedCustomerData', 2),

(N'Dimension', N'Dimension', N'Employee', N'Employee_Staging', N'GetEmployeeUpdates',

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

1. Entre as marcas Biml, adicione diretivas que especificam os dois namespaces


.NET necessários para acessar o banco de dados de metadados Biml e
carregar metadados em uma coleção de linhas:
2. <#@ import namespace="System.Data" #>

<#@ import namespace="System.Data.SqlClient" #>


CopyExplain
3. Abaixo das diretivas, em um bloco de controle, declare uma variável com uma
cadeia de conexão para o banco de dados de metadados, conforme mostrado
no trecho de código a seguir:connectionString
4. <#

5. string connectionString = @"Data Source=ETLInAzureBook\MSSQL2019; Persist Security

Info=true; Integrated Security=SSPI; Initial Catalog=BIMLmetadata";

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

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

14. DataTable dtTables = new DataTable();

15. using (SqlConnection sqlConn = new SqlConnection (connectionString))

16. {

17.     string sqlCmd = @"SELECT * from dbo.TableConfig;";

18.     SqlDataAdapter sqlDtAdp = new SqlDataAdapter(sqlCmd, sqlConn);

19.     sqlDtAdp.Fill(dtTables);  

20. }       

21. foreach(DataRow drTable in dtTables.Rows) {

22. #>

23. <Container Name="Load <#=drTable["TableName"]#> <#=drTable["TableType"]#>">

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

SqlDataAdapter pode ser usado para carregar tabelas de metadados e iterar


através de seus registros, geralmente contendo informações de tabela ou coluna,
para implementar a automação.

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

Figura 10.8 – Uma captura de tela mostrando a propriedade ConstraintMode


Outra opção é definir como . Isso encadeará as tarefas juntas para serem
executadas em uma sequência na conclusão, independentemente de ter sido um
sucesso ou falha.ConstraintModeLinerOnCompletion

O que é ótimo no BimlExpress é seu IntelliSense, um auxílio de conclusão de


código que torna a escrita de código mais eficiente. O desenvolvedor não precisa
se lembrar de toda a sintaxe, parâmetros e seus valores permitidos. Você pode
ver um exemplo do IntelliSense na captura de tela a seguir:

Figura 10.9 – Uma captura de tela mostrando o uso do IntelliSense

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.

Gerando um pacote SSIS com Executar


tarefas SQL
Agora vamos criar um pacote SSIS com um pouco mais de carne nele. O pacote
SSIS original que desejo gerar automaticamente, , contém várias tarefas dentro de
cada Contêiner de Sequência, como uma Tarefa de Expressão e Executar Tarefas
SQL, conforme mostrado na captura de tela a seguir:DailyETLMain.dtsx
Figura 10.10 – Uma captura de tela mostrando DailyETLMain.dtsx

Começaremos com o código Biml que foi iniciado na receita anterior e


adicionaremos programaticamente restrições de precedência, conexões, variáveis
e tarefas dentro de cada . O que queremos realizar nesta receita é gerar um
pacote SSIS com contêineres de sequência que serão executados um após o
outro com sucesso. Cada contêiner de sequência conterá quatro tarefas: uma e
três . O pacote resultante será mais um passo em direção ao uso do Biml para
gerar automaticamente um pacote SSIS de amostra do projeto Wide World
Importers .Sequence ContainerExpression TaskExecute SQL TasksDailyETLMain.dtsx

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

Figura 10.11 – Uma captura de tela mostrando o bloco de controle no Biml

2. Vamos adicionar Conexões ao pacote SSIS, precisaremos delas para nossa


Tarefa Executar SQL. No arquivo BimlScript, logo acima do
elemento Packages, adicione o seguinte trecho de código:
3. <Connections>

4.         <Connection Name="WWI_Source_DB" CreateInProject="true" ConnectionString="Data

Source=.;Initial Catalog=WideWorldImporters;Provider=SQLNCLI11.1;

5. Integrated Security=SSPI;Auto Translate=False;" />

6.         <Connection Name="WWI_DW_Destination_DB" CreateInProject="true"

ConnectionString="Data Source=.;Initial

Catalog=WideWorldImportersDW;Provider=SQLNCLI11.1;

7. Integrated Security=SSPI;Auto Translate=False;" />

</Connections>
CopyExplain

Estamos definindo duas conexões aqui – uma é para o banco de dados de


origem e outra é para o banco de dados de destino, . Ambos serão usados
nesta receita e nas receitas seguintes.WideWorldImportersWideWorldImportersDW

8. Dentro do elemento Package XML, adicione um novo atributo:


ConstraintMode="LinearOnSuccess"
CopyExplain

Isso criará uma restrição de precedência entre as tarefas na ordem em que


essas tarefas são adicionadas ao pacote.

9. Agora vamos precisar adicionar variáveis. Existem quatro variáveis que são


necessárias para o nosso pacote final. Adicione o seguinte código logo abaixo
da tag de abertura:Package
10. <Variables>

11. <Variable Name="LastETLCutoffTime" DataType="DateTime"

IncludeInDebugDump="Include">4/11/2016 10:39:10 AM</Variable>

12.      <Variable Name="LineageKey" DataType="Int32"

IncludeInDebugDump="Include">0</Variable>

13.      <Variable Name="TableName" DataType="String"

IncludeInDebugDump="Exclude"></Variable>

14.      <Variable Name="TargetETLCutoffTime" DataType="DateTime"

IncludeInDebugDump="Include">4/13/2016 11:25:23 AM</Variable>

</Variables>
CopyExplain

A coleção estará localizada acima do elemento , conforme mostrado na


captura de tela a seguir:VariablesTasks
Figura 10.12 – Uma captura de tela mostrando a definição de variável no Biml

15. Adicione um atributo ConstraintMode ao elemento e defina-o


como LinearOnSuccess, porque queremos que as tarefas dentro sejam
executadas uma após a outra:Container
<Container Name="Load <#=drTable["TableName"]#> <#=drTable["TableType"]#>"

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"]#>"

Expression="@[User::TableName] = &quot;<#=drTable["TableName"]#>&quot;" />


CopyExplain

Podemos referenciar uma variável de usuário no Biml usando esta sintaxe: .


Você também notará o uso de – é necessário para representar uma aspas. O
arquivo Biml é um arquivo XML e é sensível a caracteres especiais, como
less-than, ; maior que, ; apóstrofo; aspas duplas, ; e o E comercial, .
Consulte https://support.varigence.com/hc/en-us/articles/360000975975-
Protected-XML-Characters-in-Biml para obter a lista de caracteres especiais
em Biml que precisam ser representados com sequências de
escape. @[User::<VariableName>]&quot;<>'"&

17. Em seguida, adicione o código XML para , chamado , conforme mostrado no


seguinte trecho de código:Execute SQL TaskGet Lineage Key
18. <ExecuteSQL Name="Get Lineage Key" ConnectionName="WWI_DW_Destination_DB"

ResultSet="SingleRow">

19. <Results>

20.       <Result Name="LineageKey" VariableName="User.LineageKey" />

21.       </Results>

22.       <Parameters>

23.        <Parameter Name="0" VariableName="User.TableName" Length="-1"

DataType="String" />

24.            <Parameter Name="1" VariableName="User.TargetETLCutoffTime" Length="-1"

DataType="Date" />

25.       </Parameters>

26. <DirectInput>EXEC Integration.GetLineageKey ?,?;      </DirectInput>

</ExecuteSQL>
CopyExplain

Agora vamos analisar cada elemento e atributo XML:

a) O atributo de é onde especificamos o nome para a conexão de


destino.ConnectionNameExecuteSQL

b) O elemento contém informações sobre onde atribuir o valor retornado.


Aqui, nós o atribuímos à variável de usuário .ResultsLineageKey

c) O elemento de coleção contém informações sobre quais parâmetros de


entrada são necessários para a tarefa Executar SQL. Aqui, precisamos de
dois parâmetros: e . Precisamos especificar seus nomes e tipos de dados
dentro do elemento de coleção. Assim como no SSIS, os nomes desses
parâmetros são a ordem em que eles serão referenciados na
instrução.ParametersTableNameTargetETLCutOffTimeParametersExecute

d) E finalmente, no elemento , podemos especificar a instrução T-SQL que


queremos executar. Chamamos um procedimento armazenado e passamos
dois de nossos parâmetros para ele. O resultado será retornado na
variável.DirectInput[Integration].[GetLineageKey]LineageKey

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

29. <DirectInput>DELETE FROM

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>

33.       <Result Name="CutoffTime" VariableName="User.LastETLCutoffTime" />

34.    </Results>

35.    <Parameters>

36.      <Parameter Name="0" VariableName="User.TableName" Length="-1"

DataType="String" />

37.      </Parameters>

38.      <DirectInput>EXEC Integration.GetLastETLCutoffTime ?;</DirectInput>


</ExecuteSQL>
CopyExplain

Esta Tarefa Executar SQL recupera uma tabela.LastETLCutOffTime

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

Figura 10.13 – Uma captura de tela mostrando o pacote SSIS gerado

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

Para entender melhor como funciona, vamos examinar mais de perto o painel de


visualização desta receita. O painel de visualização mostra o Biml compilado e
isso pode ajudar muito na hora de depurar. Olhando para o painel de visualização
aqui, vemos como Biml passou pela tabela de metadados e produziu elementos
Biml para cada linha, conforme mostrado na captura de tela a seguir.

Destaquei cada lugar na captura de tela onde Biml coloca um valor da tabela de
metadados, como foi instruído a fazer:

Figura 10.14 – Uma captura de tela mostrando o Biml compilado

O painel de visualização mostra o código intermediário produzido pelo Biml antes


de gerar um pacote SSIS. É aqui que podemos ver como o BimlScript do bloco de
controle está sendo compilado e como o XML Biml original é expandido seguindo
as instruções dadas no bloco de controle. Nesta receita, no arquivo BimlScript,
temos um loop que percorre cada registro na tabela de metadados e, para cada
registro, ele instrui Biml a gerar um e suas tarefas. No painel de visualização, o
loop já está compilado e o resultado é vários listados um após o outro, conectados
por restrições de precedência e contendo quatro tarefas dentro de cada
contêiner. foreachSequence ContainerforeachSequence Containers

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.

Usando Converter pacote SSIS em Biml


O pacote SSIS de exemplo para a solução primeiro tem três tarefas que precedem
uma lista de , e elas são bastante básicas. Então, em vez de passar por cima do
Biml para criá-los, o que já abordamos em receitas anteriores, vamos demonstrar
uma funcionalidade útil no BimlExpress que pode ser uma ótima ferramenta de
aprendizado também - é a opção de Converter Pacote SSIS para
Biml. DailyETLMain.dtsxWideWorldImportersSequence Containers

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

1. Altere o nome do pacote no elemento Package para .Recipe5


2. Clique com o botão direito do mouse no pacote SSIS original da solução,
chamado e escolha a opção Converter pacotes SSIS em Biml,
conforme mostrado na captura de tela a
seguir:WideWorldImportersDailyETLMain.dtsx

Figura 10.15 – Uma captura de tela mostrando o item de menu Converter


pacotes SSIS em Biml

3. A tela Importar pacotes será aberta. Deixe todos os valores como padrão e


clique em Importar, conforme mostrado na captura de tela a seguir:
Figura 10.16 – Uma captura de tela mostrando o assistente Importar Pacotes

4. A tela será alterada e um botão Adicionar ao projeto será exibido. Clique


nele.
5. Um novo arquivo Biml será adicionado ao projeto com o nome padrão e
aberto no Visual Studio. Dentro, você verá o script Biml que corresponde ao
pacote SSIS original. Você pode usá-lo como está para gerar um pacote
idêntico ao pacote SSIS original.BimlScript.biml
6. Vamos selecionar o script Biml para as três tarefas que precisamos e copiá-lo
para nossa área de transferência, conforme mostrado na captura de tela a
seguir:

Figura 10.17 – Uma captura de tela mostrando as tarefas definidas no Biml


As três tarefas que precisamos estão localizadas entre os elementos e o
primeiro elemento.VariablesContainer

7. Cole o script copiado no , diretamente sob o elemento de abertura e acima do


bloco de controle, conforme mostrado na captura de tela a
seguir:Recipe5.bimlTasksforeach

Figura 10.18 – Uma captura de tela mostrando as tarefas definidas no Biml

8. O código Biml gerado não usou os nomes de conexão que definimos no ,


portanto, precisaremos atualizar o na Tarefa Executar SQL e defini-lo como o
nome do banco de dados de destino, conforme mostrado no trecho de código
a seguir:Recipe5.bimlConnectionName
<ExecuteSQL Name="Ensure Date Dimension includes current year"

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

Vamos para a próxima seção!

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

Eu recomendaria usar esta ferramenta de importação de pacotes com muita


frequência no início, pois tornará o aprendizado do Biml rápido e fácil. É muito
mais rápido aprender coisas novas no Biml convertendo uma funcionalidade SSIS
e depois olhando para o código Biml produzido do que lendo artigos ou
vasculhando a internet na busca de um exemplo.

Abordamos apenas uma opção aqui para importar um pacote SSIS com


configurações padrão, mas a ferramenta Importar Pacotes também pode importar
projetos SSIS inteiros. Você também pode tentar diferentes opções de
importação.

Gerando uma alteração em massa nos


procedimentos armazenados
Se quisermos gerar automaticamente o pacote SSIS de exemplo para a solução,
como pretendíamos fazer no início, precisamos trabalhar em alguns pré-requisitos.
Esses pré-requisitos são tão interessantes e desafiadores que é melhor
dedicar uma receita separada a eles. O pacote SSIS da solução de exemplo usa
na Fonte OLE DB da Tarefa de Fluxo de Dados para recuperar dados da
origem. No pacote original, a instrução que chama cada um usa a cláusula para
especificar tipos de dados e nomes de coluna para o conjunto de resultados de
retorno. Isso é necessário para que o SSIS funcione corretamente porque todas
usam tabelas temporárias e, como as tabelas temporárias são resolvidas em
tempo de execução, o SSIS não consegue recuperar metadados para cada coluna
de saída do conjunto de dados de
resultados.WideWorldImportersWideWorldImportersGet stored proceduresEXECUTEGet
stored procedureRESULT SETGet stored procedures

O uso de tabelas temporárias também é um desafio para Biml e, além da cláusula,


precisamos fazer outra coisa. A limitação no Biml é a mesma: o Biml não pode
recuperar os metadados necessários para gerar colunas de Saída de Fluxo de
Dados.RESULT SET

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

Esta solução alternativa foi obtida da comunidade em stackoverflow.com;aqui está


o link para a ideia que estamos explorando nesta
receita: https://stackoverflow.com/questions/1579476/using-temp-tables-in-ssis/
5076757#5076757.

O que queremos fazer é, no , passar por cada procedimento armazenado usado


em Tarefas de Fluxo de Dados para obter os dados de origem e adicionar uma
instrução falsa na parte superior do código de Procedimento Armazenado que
fornecerá informações sobre quais colunas serão retornadas por esse
procedimento armazenado. Essa instrução estará dentro de uma instrução
condicional que sempre será avaliada como false, conforme mostrado no exemplo
no trecho de código a seguir:Source DatabaseSELECTSELECT

IF 1 = 0 -- This will never really execute.

BEGIN
     SELECT

     CAST (0 AS int) AS [WWI City ID],

     CAST (NULL AS nvarchar(50)) AS City,

     CAST (NULL AS nvarchar(50)) AS [State Province] ,

     CAST (NULL AS nvarchar(50)) AS Country ,

     CAST (NULL AS nvarchar(30)) AS Continent ,

     CAST (NULL AS nvarchar(50)) AS [Sales Territory] ,

     CAST (NULL AS bigint) AS [Latest Recorded Population],

     CAST (NULL AS datetime2(7)) AS [Valid From],

     CAST (NULL AS datetime2(7)) AS [Valid To]

END
CopyExplain

Agora podemos começar a receita.

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

1. Copie apenas o código de bloco de controle da receita anterior, , para o novo


arquivo Biml. Copie apenas a parte entre o elemento de abertura e o
elemento , conforme mostrado na captura de tela a
seguir:C#Recipe5.biml<Biml> <Connections>
Figura 10.19 – Uma captura de tela mostrando os blocos de controle no Biml

2. Adicione um novo arquivo clicando com o botão direito do mouse no projeto


SSIS e escolhendo Adicionar novo arquivo C#, conforme mostrado na
captura de tela a seguir:C#

Figura 10.20 – Uma captura de tela mostrando como adicionar um novo


arquivo C#

3. Renomeie-o para . Precisamos criar essa pequena classe de utilitário para


nos ajudar a gerar uma cadeia de caracteres T-SQL do tipo de dados a partir
de metadados do SQL Server. Colocar essa lógica fora do arquivo Biml nos
ajuda a manter o arquivo Biml gerenciável e nos permite reutilizar a lógica em
outros arquivos Biml. Code.csC#
4. Abra o arquivo e substitua a classe padrão, , com o seguinte trecho de
código:Code.csMyClass
5. public static class BIMLHelper

6. {
7.     public static string GetDataType(string strDataType, string CharLength, string

NumPrecision, string NumScale, string DatePrecision)

8.     {

9.         string strResult = strDataType;

10.         if (strDataType == "int" || strDataType == "bigint" || strDataType == "geography" ||

strDataType == "varbinary" || strDataType == "date")

11.             strResult += "";

12.         else if (!string.IsNullOrEmpty(CharLength))

13.             strResult += " (" + CharLength + ")";

14.         else if (!string.IsNullOrEmpty(NumScale) && NumScale != "0" && !

string.IsNullOrEmpty(NumPrecision))

15.             strResult += " (" + NumPrecision + "," + NumScale + ")";

16.         else if (!string.IsNullOrEmpty(NumPrecision))

17.             strResult += " (" + NumPrecision + ")";

18.         else if (!string.IsNullOrEmpty(DatePrecision))

19.             strResult += " (" + DatePrecision + ")";

20.         return strResult;

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

23. Adicione uma nova cadeia de conexão para o banco de dados de destino.


Para fazer isso, adicione o seguinte trecho de código sob a linha que inicializa
a cadeia de conexão para o banco de
dados: WideWorldImportersDWBIMLmetadata
string connStrDest = @"Data Source=ETLInAzureBook\MSSQL2019;Persist Security

Info=true;Initial Catalog=WideWorldImportersDW;Integrated Security=SSPI;";


CopyExplain

Essa cadeia de conexão precisa ser adicionada porque nos conectaremos ao


banco de dados de destino para ler os metadados das tabelas de destino.

24. Adicione o seguinte código no final do bloco de controle:


25.     foreach(DataRow drTable in dtTables.Rows) {

26. string strColumnSQL = string.Format(@"SELECT * FROM

INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'Integration' AND

TABLE_NAME = '{0}' AND NOT (DATA_TYPE = 'int' AND COLUMN_NAME LIKE '%

key') AND ORDINAL_POSITION > 1

27. ORDER BY ORDINAL_POSITION",drTable["StagingTableName"]);

28. string strInject = @"IF 1 = 0

29. BEGIN

30. SELECT

31. ";

32. using (SqlConnection sqlConnDest = new SqlConnection(connStrDest))

33.     {

34.       SqlCommand command = new SqlCommand(strColumnSQL,sqlConnDest);

35.       sqlConnDest.Open();
36.       SqlDataReader reader = command.ExecuteReader();

37.       if (reader.HasRows) {

38.         while (reader.Read())

39.      { strInject += @" CAST(NULL AS " +

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()) + @") AS [" +

reader["COLUMN_NAME"] + @"],"; }

40.         }

41.         reader.Close();

42.         strInject = strInject.TrimEnd(',') + @" END";

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

45. DECLARE @marker NVARCHAR(MAX) = 'SET NOCOUNT ON;

46.     SET XACT_ABORT ON;'

47. DECLARE @inject NVARCHAR(MAX) =

48. 'SET NOCOUNT ON;

49.     SET XACT_ABORT ON;

50. <#=strInject#>

51. '

52. SELECT @sp = OBJECT_DEFINITION(OBJECT_ID('[Integration].

[<#=drTable["GetStoredProc"]#>]'))
53. SET @sp = REPLACE(@sp,' PROCEDURE ', ' OR ALTER PROCEDURE ')

54. SET @sp = REPLACE(@sp,@marker,@inject)

55. PRINT @sp

56. EXEC (@sp)

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

É aqui que fechamos o ciclo externo.foreach

58. Salve o arquivo Biml e atualize a visualização clicando no botão Atualizar


visualização. O código que aparecerá na visualização é o código T-SQL.
Copie o código T-SQL e cole-o em uma janela Nova consulta do SSMS.
Remova os ags tde abertura e fechamento e execute o código no banco de
dados de origem – , conforme mostrado na captura de tela a
seguir:<Biml>WideWorldImporters
Figura 10.21 – Uma captura de tela mostrando o código T-SQL gerado colado no
SSMS

Vamos olhar por baixo do capô e ver como funciona.

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

Vejamos atentamente o Passo 7 desta receita. O código contém dois loops: o


primeiro – um loop – passa por uma lista de tabelas e obtém os metadados de
coluna do SQL Server para cada tabela, e o loop interno itera por cada coluna e
produz um para cada coluna com uma conversão para um .foreachwhileT-SQL
statementSQL Data Type

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

CAST(NULL AS <datatype>) AS <ColumnName>


CopyExplain

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

CAST(NULL AS <datatype>) AS <ColumnName1>

, CAST(NULL AS <datatype>) AS <ColumnName2>

, CAST(NULL AS <datatype>) AS <ColumnName3>


CopyExplain

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

À medida que executamos o , substituímos o código de procedimento armazenado


antigo no banco de dados de origem pelo novo.ALTER DDL

Agora, cada procedimento armazenado chamado na Tarefa de Fluxo de Dados é


capaz de mostrar ao Biml quais metadados de coluna ele retornará.

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

Consulte o exemplo do uso do LINQ no seguinte trecho de código:

var sourceConnection = SchemaManager.CreateConnectionNode("Destination", @"Data

Source=.;Initial Catalog=WideWorldImportersDW;Provider=SQLNCLI11.1;Integrated

Security=SSPI;Auto Translate=False;");

var sourceMetadata = sourceConnection.GetDatabaseSchema();

DataTable dtTables = new DataTable();

using (SqlConnection sqlConn = new SqlConnection(connectionString))

    string sqlCmd = @"SELECT * from dbo.TableConfig;"

    SqlDataAdapter sqlDtAdp = new SqlDataAdapter(sqlCmd, sqlConn);

    sqlDtAdp.Fill(dtTables);  
}

var tableConfig = from DataRow myRow in dtTables.Rows select myRow;

var metadataCols = from tables in sourceMetadata.TableNodes.ToList()

join sqltables in tableConfig on new {Table = tables.Name.ToString()} equals new {Table =

sqltables["StagingTableName"].ToString()}

select new { Columns = tables.Columns, SqlCode = tables.GetTableSql(), Name = tables.Name,

TableType = sqltables["TableType"], GetStoredProc = sqltables["GetStoredProc"],

StagingTableName = sqltables["StagingTableName"] };
CopyExplain

Agora vamos para a próxima receita!

Gerando um pacote SSIS contendo uma


tarefa de fluxo de dados
Aqui, estamos finalmente chegando a um pacote SSIS mais complicado que
conterá uma Tarefa de Fluxo de Dados, e em uma receita anterior, Gerando uma
alteração em massa para procedimentos armazenados, já fizemos algumas
alterações de preparação em procedimentos armazenados no banco de dados de
amostra para superar as limitações do Biml relacionadas ao uso de tabelas
temporárias. Agora podemos nos concentrar na própria Tarefa de Fluxo de
Dados.WideWorldImporters

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

Info=true;Initial Catalog=WideWorldImportersDW;Integrated Security=SSPI;";


CopyExplain

Essa cadeia de conexão precisa ser adicionada porque nos conectaremos ao


banco de dados de destino para obter os metadados de coluna das tabelas
de destino.

4. Assim como na receita anterior, Gerando uma alteração em massa nos


procedimentos armazenados, adicione uma referência ao arquivo. Para fazer
isso, adicione a seguinte diretiva logo abaixo do elemento de abertura, no
arquivo:Code.cs<Biml>line 2
<#@ code file="Code.cs" #>    
CopyExplain

Vamos usar a aula novamente nesta receita.BIMLHelper

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

INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'Integration' AND

TABLE_NAME = '{0}' AND NOT (DATA_TYPE = 'int' AND COLUMN_NAME LIKE '%

key') AND ORDINAL_POSITION > 1 ORDER BY ORDINAL_POSITION",

drTable["StagingTableName"]);  
7. string strResultSet = @"WITH RESULT SETS ( (";

8. using (SqlConnection sqlConnDest = new SqlConnection(connStrDest)) {

9.    SqlCommand command = new SqlCommand(strColumnSQL,sqlConnDest);

10.    sqlConnDest.Open();

11.    SqlDataReader reader = command.ExecuteReader();

12.      if (reader.HasRows) {

13.         while (reader.Read()) {

14.          strResultSet += @"[" + reader["COLUMN_NAME"] + "] " +

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();

        strResultSet = strResultSet.TrimEnd(',') + @"));"; }


CopyExplain

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>

19.     <OleDbSource Name = "Integration_Get<#=drTable["TableName"]#>Updates"

ConnectionName = "WWI_Source_DB">

20.        <Parameters>

21.           <Parameter Name="@LastCutoff:Input"

VariableName="User.LastETLCutoffTime" />
22.           <Parameter Name="@NewCutoff:Input"

VariableName="User.TargetETLCutoffTime" />

23.        </Parameters>

24.        <DirectInput>EXEC Integration.<#=drTable["GetStoredProc"]#> <#if(!

drTable["GetStoredProc"].ToString().Equals("GetStockHoldingUpdates")){#>?, ?<#}#>

25. <#=strResultSet#>

26.        </DirectInput>

    </OleDbSource>
CopyExplain

Nesta etapa, adicionamos uma marca de abertura do elemento e, em


seguida, fornecemos os detalhes para a origem OLE DB, assim como
teríamos em uma fonte OLE DB do Visual Studio: um nome de conexão,
parâmetros e o comando SQL. <Dataflow>

Observe que a instrução está na variável. WITH RESULTS SETstrResultSet

27. Vamos trabalhar no destino OLE DB para a Tarefa de Fluxo de Dados.


Adicione o seguinte código para concluir a definição de tarefa de fluxo de
dados em Biml:
28.     <OleDbDestination Name="Integration_<#=drTable["StagingTableName"]#>"

ConnectionName="WWI_DW_Destination_DB" TableLock="false">

29.         <ExternalTableOutput Table="[Integration].

[<#=drTable["StagingTableName"]#>]" />

30.      </OleDbDestination>

31.   </Transformations>

</Dataflow>
CopyExplain

Especificamos aqui a conexão, o nome da tabela e uma opção de bloqueio de


tabela para o destino. Observe como um nome de tabela é recuperado
usando o bloco de controle Expression, , que está lendo o nome da tabela da
coluna da tabela de
metadados.<#=drTable["StagingTableName"]#>StagingTableName

32. Agora adicione a última abaixo da Tarefa de Fluxo de Dados, conforme


mostrado no seguinte trecho de código:Execute SQL Task
33. <ExecuteSQL Name="Migrate Staged <#=drTable["TableName"]#> Data"

ConnectionName="WWI_DW_Destination_DB">

34. <DirectInput>EXEC Integration.<#=drTable["MigrateStoredProc"]#>;</DirectInput>

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

Agora podemos descobrir como funciona.

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

Este código é semelhante ao código que preparamos em uma receita anterior


porque ele faz quase a mesma coisa, mas em um nível diferente. A
receita Gerando uma alteração em massa para Procedimentos armazenados foi
necessária porque Biml não conseguiu entender os metadados de coluna
retornados de procedimentos armazenados. Nesta etapa, estamos fornecendo
metadados de coluna para o SSIS, porque é o SSIS que agora precisa de
metadados de coluna e não pode obtê-los de procedimentos armazenados.

Na Etapa 6, um nome de procedimento armazenado é recuperado usando o bloco


de controle Expression , que lê o nome do procedimento armazenado na coluna
da tabela de metadados.<#=drTable["GetStoredProc"]#>GetStoredProc

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

Gerando seu primeiro Azure Data


Factory
Agora vamos entrar na nuvem e começar a jogar com o Azure Data Factory.
Trabalhar no Biml com o Azure Data Factory está fora dos domínios de um
complemento BimlExpress e requer que o aplicativo autônomo BimlStudio
funcione. Para fins de receitas do Azure Data Factory, você pode instalar uma
versão de avaliação do BimlStudio, que permitirá que você o experimente
gratuitamente por 30 dias.

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.

Você precisará ter o Windows PowerShell 7.x ou poderá instalá-lo posteriormente


em seu computador. Normalmente, o Windows PowerShell vem instalado por
padrão em todos os sistemas Windows, mas você sempre pode instalar a versão
mais recente do PowerShell disponível para seu sistema operacional a partir de
https://tinyurl.com/yd5bxsy6:

1. Instale o Azure PowerShell seguindo as instruções descritas nesta página da


Web: https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?
view=azps-3.7.0&viewFallbackFrom=azps-3.2.0.
2. Abra o Windows PowerShell e digite o seguinte comando:
Install-Module -Name Az -AllowClobber
CopyExplain
3. Pressione Enter e escolha Y quando solicitado a instalar o provedor NuGet.

Entre em Sim para Todos para prosseguir com a instalação do pacote Az.A


É isso, agora você está pronto para usar o Azure PowerShell para suas
implantações do Azure Data Factory.

Você também precisará se conectar à sua assinatura e conta do Azure, da


seguinte maneira.:

4. Abra o Microsoft Windows PowerShell Integrated Scripting Environment


(ISE) como administrador e digite o seguinte comando, onde é sua ID de
assinatura: <xxxx-xxxx-xxxx>
Connect-AzAccount -Subscription <xxxx-xxxx-xxxx>
CopyExplain

Para obter sua ID de assinatura, vá para o portal do Azure, vá para sua


assinatura e copie a ID da assinatura, conforme mostrado na captura de tela
a seguir:

Figura 10.22 – Uma captura de tela mostrando onde obter o ID da assinatura

5. Clique no botão verde Executar script, conforme mostrado na captura de tela


a seguir:
Figura 10.23 – Uma captura de tela mostrando como executar scripts no ISE
do Windows PowerShell

Você será solicitado a inserir suas credenciais.

6. Entre com sua conta do Azure. Após a entrada bem-sucedida, você verá a
seguinte saída:

Figura 10.24 – Uma captura de tela mostrando uma entrada bem-sucedida no


Azure PowerShell

É isso; Estamos conectados e prontos para começar!

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

4. Clique em Testar conexão no canto inferior direito e, se tudo estiver OK, uma


mensagem Conexão bem-sucedida deverá aparecer.
5. Clique em Criar para salvar as alterações. O primeiro serviço vinculado é feito
agora, e podemos prosseguir com o trabalho do BimlStudio.
6. Abra o BimlStudio 2019. Crie um novo projeto usando modelos locais.
7. Nomeie o novo projeto ADFCloudETL, escolha um local no sistema de
arquivos onde o projeto BimlStudio será salvo e clique em OK conforme
mostrado na captura de tela a seguir:

Figura 10.26 – Captura de tela mostrando a criação do novo projeto no


BimlStudio

BimlStudio abrirá um novo projeto vazio chamado .ADFCloudETL.mst

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

9. No arquivo Biml, substitua o elemento padrão com o seguinte


código:<DataFactory>
10. <DataFactory Name="ADFCloudETL">

11.   <LinkedServices>

12.     <HttpServer Name="LSHTTP" AuthenticationType="Anonymous"

Url="https://cadatacatalog.state.gov/"/>

13.     <AzureDataLakeStoreGen2 Name="ETLInAzure" AccountKey="xxx"

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

17.     <AzureDataLakeGen2 Name="DSDL2" LinkedServiceName="ETLInAzure"

FolderPath="geo" File="geopoliticalregions.json"/>

18.   </Datasets>

19.   <Pipelines>

20.     <Pipeline Name="Copy Political Regions">

21.   <Activities>

22.     <Copy Name="Copy Regions">

23. <HttpSource DatasetName="DSHTTP"/>

24. <AzureDataLakeGen2Sink DatasetName="DSDL2"/>

25.           </Copy>

26.         </Activities>

27.       </Pipeline>

28.   </Pipelines>

</DataFactory>
CopyExplain

O Biml anterior tem três seções – , e ; e eles correspondem aos conceitos do


Data Factory que você pode definir manualmente no Data
Factory:<LinkedServices><Datasets><Pipelines>

a) No elemento , o atributo está apontando para uma fonte de dados aberta


em https://cadatacatalog.state.gov/.<LinkedServices>/<HttpServer>Url

b) No elemento , o atributo contém a URL do Repositório Azure Data Lake


Gen 2 que foi criado no Capítulo 4, Integração de Dados do Azure, e o
atributo deve conter a chave de conta exclusiva da conta de armazenamento.
Como no momento, o BimlStudio 2019 não pode gerar corretamente o serviço
vinculado para o Azure Data Lake Storage Gen2, podemos deixá-lo como
está.<LinkedServices>/<AzureDataLakeStoreGen2>UrlAccountKey

c) No elemento , o atributo contém o caminho para um arquivo JSON que


queremos baixar. Esse caminho muda de tempos em tempos, portanto, para
obter a URL de trabalho, vá
para https://cadatacatalog.state.gov/dataset/reference-data e copie o caminho
para o conjunto de dados clicando em Download e copiando o caminho
relativo. No momento em que escrevo,
era .<Datasets>/<HttpFile>RelativeUrlgeopoliticalregion/dataset/dbadcbe4-
3d99-4225-b0e1-5f300f2ccb62/resource/94d1147b-03ad-431a-98ba-71e0f6d8a879/
download/geopoliticalregion.json

No elemento , e atributos devem ser definidos para os valores


correspondentes onde o arquivo será baixado e como o arquivo será
chamado.<Datasets>/<AzureDataLakeGen2>FolderPathFile

29. Clique em Salvar Tudo no canto superior esquerdo para salvar no Azure


Data Factory.Biml
30. Crie o projeto para gerar arquivos JSON do Azure. Clique com o botão direito
do mouse no projeto e selecione Construir, conforme mostrado na captura
de tela a seguir:ADFCloudETL.mst
Figura 10.28 – Uma captura de tela mostrando como criar o projeto

Após uma compilação bem-sucedida, os arquivos JSON para o Data Factory


serão gerados na pasta de saída. Os arquivos JSON de serviços vinculados,
um para cada serviço vinculado, serão criados na pasta, da mesma forma que
os arquivos JSON e que serão gerados em suas pastas correspondentes,
conforme mostrado na captura de tela a seguir: ADFCloudETLoutput\
DataFactories\ADFCloudETL\LinkedServicesDatasetPipelines
Figura 10.29 – Uma captura de tela mostrando o JSON gerado

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"

33. $dataFactoryName = "ADFCloudETL"

34. $rootPath = "C:\Users\BookAdmin\Documents\ADFCloudETL\output\DataFactories\

ADFCloudETL"

35. Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName  -

ResourceGroupName $resourceGroupName -Name "LSHTTP" -DefinitionFile ($rootPath +"\

LinkedServices\LSHTTP.json")
36. Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName

$resourceGroupName -Name "DSHTTP" -DefinitionFile ($rootPath +"\Datasets\

DSHTTP.json")

37. Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName

$resourceGroupName -Name "DSDL2" -DefinitionFile ($rootPath +"\Datasets\DSDL2.json")

38. Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName

$resourceGroupName -Name "Copy Political Regions" -DefinitionFile ($rootPath+"\Pipelines\

Copy Political Regions.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:

Figure 10.32 – A screenshot showing the deployment of the Data Factory

41. Run the pipeline in Debug mode by clicking the Debug button.

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.

Carregando vários arquivos usando o


Data Factory
Vamos usar o BIMLStudio 2019 para construir uma solução mais elaborada.
Digamos que desejamos carregar um conjunto de arquivos disponíveis online em
nosso banco de dados local do SQL Server. Queremos usar os dados desses
arquivos para fazer relatórios, associando-os a dados locais. Nesta receita,
examinaremos a criação de uma solução do Data Factory que carrega um
conjunto de arquivos de dados em paralelo do FiveThirtyEight.com do site
no Azure Data Lake Storage Gen2 e, em seguida, em um banco de dados local
do SQL Server. FiveThirtyEight.com é uma organização de jornalismo de dados
que fornece opiniões e análises sobre política, economia e esporte, com base em
ciência de dados e análises. O site fornece acesso a uma coleção de conjuntos de
dados facilmente disponíveis para download. Para a nossa receita, vamos baixar
um conjunto de arquivos CSV contendo dados estatísticos meteorológicos, como
temperatura real, temperatura máxima, temperatura mínima e níveis de
precipitação para cada cidade, todos os dias durante um período de um ano. Cada
arquivo CSV contém dados de uma única cidade nos EUA. Usaremos uma
pequena tabela de metadados com a lista de nomes de arquivos para conduzir a
geração da solução Data Factory.

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

CREATE TABLE [dbo].[CSVConfig](

[CSVName] [nvarchar](50) NULL,

[CityName] [nvarchar](256) NULL,

[State] [nvarchar](256) NULL

) ON [PRIMARY]
CopyExplain

Insira os dados de configuração CSV nesta tabela executando o seguinte script:

INSERT INTO [dbo].[CSVConfig] ([CSVName],[CityName],[State])

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

Figura 10.33 – Uma captura de tela mostrando o tempo de execução de


integração DWsOnPremises

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:

1. No navegador, vá para o ADFCloudETL Data Factory existente com o Self-


Hosted Integration Runtime já configurado. Um serviço vinculado do Azure
Data Lake Storage Gen 2 também deve ser criado, pois fazia parte da receita
anterior, Gerando seu primeiro Azure Data Factory.

No Data Factory, vá para Conexões e, em seguida, Serviços Vinculados.


Clique no botão + Novo no canto superior esquerdo. Selecione SQL Server e
clique em Continuar.

2. No formulário Novo serviço vinculado, insira o Nome de e


selecione DWsOnPremises como tempo de execução de integração.
Adicione o nome do SQL Server e o nome do banco de dados e
escolha Autenticação do Windows como Tipo de autenticação.
Finalmente, preencha o nome de usuário e senha, conforme mostrado na
captura de tela a seguir:WideWorldImportersDW
Figura 10.34 – Uma captura de tela mostrando a criação do novo serviço
vinculado do SQL Server
Clique em Testar conexão no canto inferior direito e, se tudo estiver OK, uma
mensagem Conexão bem-sucedida deverá aparecer.

3. Clique em Criar para salvar as alterações. O SQL Server Linked Service foi


concluído agora e podemos prosseguir com as próximas etapas.
4. Abra o Visual Studio 2019 e, em seguida, abra o projeto ETLInAzure SSIS.
5. Adicione um novo arquivo Biml à sua solução e renomeie-o
para . Recipe9.biml
6. Copie as diretivas e o bloco de controle logo acima da instrução para ,
substituindo por na instrução, conforme mostrado no trecho de código a
seguir:Recipe6.bimlforeachRecipe9.bimldbo.TableConfigdbo.CSVConfigSELECT *
FROM
7. <Biml xmlns="http://schemas.varigence.com/Biml.xsd">

8. <#@ code file="Code.cs" #>    

9. <#@ import namespace="System.Data" #>

10. <#@ import namespace="System.Data.SqlClient" #>

11. <# string connectionString = @"Data Source=ETLInAzureBook\MSSQL2019;Persist

Security Info=true;Integrated Security=SSPI;Initial Catalog=BIMLmetadata";

12. DataTable dtTables = new DataTable();

13. using (SqlConnection sqlConn = new SqlConnection(connectionString))

14. {

15.     string sqlCmd = @"SELECT * from dbo.CSVConfig;";

16.     SqlDataAdapter sqlDtAdp = new SqlDataAdapter(sqlCmd, sqlConn);

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

23.     foreach(DataRow drTable in dtTables.Rows) {

#>
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()#>](

26. [city] nvarchar(256) NULL DEFAULT('<#=drTable["CityName"]#>'),

27. [weatherstationcode] nvarchar(6) NULL

DEFAULT('<#=drTable["CSVName"].ToString().Replace(".csv","")#>'),

28. [state] nvarchar(2) NULL DEFAULT('<#=drTable["State"]#>'),

29. [date] [nvarchar](60) NULL,

30. [actual_mean_temp] [nvarchar](60) NULL,

31. [actual_min_temp] [nvarchar](60) NULL,

32. [actual_max_temp] [nvarchar](60) NULL,

33. [average_min_temp] [nvarchar](60) NULL,

34. [average_max_temp] [nvarchar](60) NULL,

35. [record_min_temp] [nvarchar](60) NULL,

36. [record_max_temp] [nvarchar](60) NULL,

37. [record_min_temp_year] [nvarchar](60) NULL,

38. [record_max_temp_year] [nvarchar](60) NULL,


39. [actual_precipitation] [nvarchar](60) NULL,

40. [average_precipitation] [nvarchar](60) NULL,

41. [record_precipitation] [nvarchar](60) NULL

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

47. foreach(DataRow drTable in dtTables.Rows) {

48. #>

49. SELECT * FROM

50. [Data538].[<#=drTable""CityNam""].ToString()#>]

51. <#

52. if(i < dtTables.Rows.Count){#>

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

Here, we complete the preparation of destination tables in the database and


can proceed with the Data Factory solution. WideWorldImportersDW

57. Open BimlStudio 2019. Go to your existing project in BimlStudio. Let's build


this recipe on top of the previous recipe, so we'll be adding to an existing Biml
Data Factory Biml file.ADFCloudETL.mst
58. Open .ADFCloudETL.biml
59. At the top of the file, add directives to reference the two .NET namespaces
needed to access the Biml metadata database:
60. <#@ import namespace""System.Dat"" #>

<#@ import namespace""System.Data.SqlClien"" #>


CopyExplain
61. Above the collection element, add a control block enclosed between and ,
which will connect to a database and read data from a table that contains
information about the CSV files:<DataFactories><##>BIMLmetadatadbo.CSVConfig
62. <#

63. string connectionString = ""Data Source=ETLInAzureBook\MSSQL2019;Persist Security

Info=true;Integrated Security=SSPI;Initial Catalog=BIMLmetadat"";

64. DataTable dtTables = new DataTable();

65. using (SqlConnection sqlConn = new SqlConnection(connectionString))

66. {

67.     string sqlCmd = ""SELECT * from dbo.CSVConfig"";

68.     SqlDataAdapter sqlDtAdp = new SqlDataAdapter(sqlCmd, sqlConn);

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

ConnectionString""integrated security=True;data source=ETLInAzureBook\\

MSSQL2019;initial catalog=WideWorldImportersD"">

73.   <ConnectVia IntegrationRuntime""dWsOnPremise""></ConnectVia>

74. </SqlServer>

75. <HttpServer Url""https://raw.githubusercontent.com/fivethirtyeight/data/master/us-weather-

history"" AuthenticationType""Anonymou"" Name""FiveThirtyEightHTT"">

</HttpServer>
CopyExplain

Don't worry about getting the linked service correct, as we will set it manually


in the Data Factory. The Linked Service URL is the root link to the location of
the weather CSV
files, https://raw.githubusercontent.com/fivethirtyeight/data/master/us-weather-
history/.SqlServerHttpServer

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) {#>

78. <HttpFile Name""DSHTTP<#=drTable""CityNam""]#""

LinkedServiceName""FiveThirtyEightHTT"" RelativeUrl""<#=drTable""CSVNam""]#"" />

79. <AzureDataLakeGen2 Name""DSDL<#=drTable""CityNam""]#""

LinkedServiceName""ETLInAzur"" File""<#=drTable""CityNam""]#>.cs""

FolderPath""weathe"">

80. <TextFormat FirstRowAsHeader""tru"" ColumnDelimiter""""></TextFormat>

81.       </AzureDataLakeGen2>
82. <SqlServer LinkedServiceName""ADFCloudETL.WideWorldImportersD""

Name""DSSQL<#=drTable""CityNam""]#"" Table""Data538.<#=drTable""CityNam""]#"" />

<#}#>
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>

86.   <#foreach(DataRow drTable in dtTables.Rows) {#>

87.     <Copy Name""Copy Weather <#=drTable""CityNam""]#"">

88.       <HttpSource  

89. DatasetName""DSHTTP<#=drTable""CityNam""]#"" />

90. <AzureDataLakeGen2Sink

91. DatasetName""DSDL<#=drTable""CityNam""]#"" />

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>

99. <#foreach(DataRow drTable in dtTables.Rows)

100. {#>

101.     <Copy Name="Copy Weather

102. <#=drTable["CityName"]#> to SQL" >

103.     <AzureDataLakeGen2Source

104. DatasetName="DSDL<#=drTable["CityName"]#>" />

105. <SqlServerSink  

106. DatasetName="DSSQL<#=drTable["CityName"]#>"/>

107. </Copy>

108.   <#}#>

109.   </Activities>

</Pipeline>Save ADFCouldETL.biml file.


CopyExplain
110. On the top-left side, click on the little anvil icon to build the project, as shown
in the following screenshot:

Figure 10.35 – A screenshot showing how to build a BimlStudio project

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:

Figure 10.36 – A screenshot showing how to add a new Biml file

113. Rename the new Biml file to and open it.GenerateDeployPowerShell.biml


114. Insert the following code snippet into this file:
115. <#@ import namespace="System.Data" #>

116. <#@ import namespace="System.Data.SqlClient" #>

117. <Biml xmlns="http://schemas.varigence.com/Biml.xsd">

118. <# string connectionString = @"Data Source=ETLInAzureBook\MSSQL2019;Persist

Security Info=true;Integrated Security=SSPI;Initial Catalog=BIMLmetadata";  

119. DataTable dtTables = new DataTable();

120. using (SqlConnection sqlConn = new SqlConnection(connectionString)){

121.     string sqlCmd = @"SELECT * from dbo.CSVConfig;";

122.     SqlDataAdapter sqlDtAdp = new SqlDataAdapter(sqlCmd, sqlConn);

123.     sqlDtAdp.Fill(dtTables);  } #>


124. $resourceGroupName ="ETL"

125. $ADFName = "ADFCloudETL"

$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

$resourceGroupName -Name "FileThirtyEightHTTP" -DefinitionFile

($rootPath+"LinkedServices\FileThirtyEightHTTP.json")

128. <#foreach(DataRow drTable in dtTables.Rows) {#>

129. Set-AzDataFactoryV2Dataset -DataFactoryName $ADFName -ResourceGroupName

$resourceGroupName -Name "DSHTTP<#=drTable["CityName"]#>" -DefinitionFile

("$rootPath+"Datasets\DSHTTP<#=drTable["CityName"]#>.json") -Force

130. Set-AzDataFactoryV2Dataset -DataFactoryName $ADFName -ResourceGroupName

$resourceGroupName -Name "DSDL<#=drTable["CityName"]#>" -DefinitionFile

($rootPath+"Datasets\DSDL<#=drTable["CityName"]#>.json") -Force

131. Set-AzDataFactoryV2Dataset -DataFactoryName $ADFName -ResourceGroupName

$resourceGroupName -Name "DSSQL<#=drTable["CityName"]#>" -DefinitionFile

($rootPath+"Datasets\DSSQL<#=drTable["CityName"]#>.json") -Force

132. <#}#>

133. Set-AzDataFactoryV2Pipeline -DataFactoryName $ADFName -ResourceGroupName

$resourceGroupName -Name "CopyUSWeather" -DefinitionFile ($rootPath+"Pipelines\

CopyUSWeather.json") -Force

134. Set-AzDataFactoryV2Pipeline -DataFactoryName $ADFName -ResourceGroupName

$resourceGroupName -Name "CopyUSWeatherSQL" -DefinitionFile ($rootPath+"Pipelines\

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:

Figure 10.37 – A screenshot showing the generated PowerShell script

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:

Figure 10.38 – A screenshot showing results in the Azure portal


139. Let's run the CopyUSWeather pipeline in debug mode, and this will load
CSV data from the HTTP source to Azure Data Lake Gen2 Storage.
140. Second, run the CopyUSWeatherSQL pipeline in Debug mode to load
data from Azure Data Lake Gen2 Storage to SQL Server.
141. Now the data is loaded into an on-premises SQL server and you can use it
to make reports, cross-referencing your on-premises data with weather data
loaded from the online source. I cross-referenced weather and sales data for
the summer months (May – September) as shown in the following code
snippet:
142. SELECT SUM(profit), CAST(w.actual_mean_temp AS INT), w.state, MONTH(s.[Invoice

Date Key]), YEAR([Invoice Date Key])

143. FROM (  

144.    SELECT SUM(profit) AS profit, RIGHT(c.Customer,3) as [state], [Invoice Date Key]

145.    FROM [WideWorldImportersDW].[Fact].[Sale] sale

146.    INNER JOIN [Dimension].[Customer] c ON sale.[Customer Key] = c.[Customer Key]

147.    GROUP BY RIGHT(c.Customer,3) , [Invoice Date Key]

148. ) s

149. INNER JOIN [Data538].[weather] w ON s.[state] =  w.[state] + ')' AND w.[date] = s.[Invoice

Date Key]

150. GROUP by CAST(w.actual_mean_temp  AS INT), w.state, MONTH(s.[Invoice Date Key]),

YEAR([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.

O BimlStudio 2019 é usado aqui para aplicar um padrão repetitivo à tarefa de


carregar vários arquivos CSV com esquema idêntico e gerar componentes do
Data Factory (conjuntos de dados e atividades de cópia) para cada arquivo.
Também usamos o Biml para gerar um script do PowerShell que implanta cada
componente no Azure.

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.

Biml é uma ferramenta que acelera enormemente o desenvolvimento. Espero que


gostem de aprender e usá-lo tanto quanto eu!

Você também pode gostar