Utilizando o framework Spark. PySpark e Google Colab no tratamento de dados.
Antes de iniciar a prática, vamos discutir alguns conceitos importantes para o entendimento da aplicação.
O Apache Spark trata-se de uma ferramenta de análise e processamento de dados multi-linguagem, indicada para processamento de grandes volumes de dados de forma paralela e distribuída, utilizada principalmente na área de engenharia de dados, ciência de dados e machine learning entre outras possíveis aplicações.
Componentes
Uma das principais vantagens na utilização do Spark em comparação a ferramentas similares, como o Hadoop, são os componentes integrados a própria ferramenta, todos funcionando sobre o Spark Core. Entre os principais temos:
- Spark Streamming: componente para processamento de fluxos em tempo real.
- GraphX: componente para processamento sobre grafos.
- MLlib: biblioteca que conta com diversos algoritmos utilizados para clustering e aprendizado de máquina.
- SparkSQL: possibilita utilização de linguagem SQL para realizar consultas e processamentos dentro do Spark.
Com esses componentes conseguimos construir as aplicações utilizando Spark. Para isso precisamos entender qual é a arquitetura padrão.
Arquitetura Spark
A arquitetura de uma aplicação feita com Spark pode ser dividida em três partes principais:
1- Driver Program: Aplicação principal, gerencia a aplicação e executa o processamento pré programado.
2- Cluster Manager: componente necessário apenas para aplicações distribuídas, responsável pela administração das máquinas definidas como workers.
3- Workers: máquinas que executarão as tarefas enviadas pelo Driver Program. Em caso de uma aplicação local, a mesma máquina desempenha o papel de Driver Program e Worker.
Componentes Spark
Criar uma aplicação utilizando o modelo de programação Spark necessita o conhecimento de alguns conceitos fundamentais, entre eles os principais são:
1- RDD (Resilient Distributed Datasets): Abstração de um conjunto de objetos distribuídos no cluster, armazenados em memória. É o objeto principal do modelo de programação Spark, responsável pela execução de processamento de dados.
2- Operações: São as transformações, como agrupamentos e filtros, ou ações realizadas em um RDD.
3- Spark Context: Objeto que faz a conexão entre o Spark e o programa desenvolvido.
Um programa Spark pode ser visto como uma sequência de transformações e ações realizadas em conjuntos de dados.
Principais vantagens do Apache Spark
Sintetizando, podemos apontar as principais vantagens de sua utilização em tópicos.
- Integração e ampla biblioteca: possui uma vasta gama de componentes e bibliotecas, possibilitando a utilização de recursos em tarefas complexas como machine learning.
- Velocidade: atinge alto desempenho relacionado a análise, consulta e execução de tratamentos em dados.
- Facilidade: a ferramenta conta com mais de 80 operadores de alto nível que possibilitam a criação de aplicações paralelas.
A utilização das bibliotecas do Spark pode aumentar significativamente a produtividade do desenvolvedor.
Vamos a prática!
Com esses conceitos básicos podemos seguir para um exemplo de implementação de análise de dados utilizando as bibliotecas do Framework Spark.
O Spark oferece suporte as linguagens Scala, Python, Java, SQL, R, C# e F#. Iremos utilizar em nosso exemplo Python.
Como o propósito do tutorial é apresentar conceitos fundamentais e uma breve demonstração, iremos construir uma aplicação local (não distribuída), utilizando o PySpark através do recurso de notebook do Google Colab.
O Google Colab, ou formalmente Google Colaboratory, é um serviço de nuvem gratuito e disponibilizado pelo Google. Essa ferramenta permite a criação e edição de código em ambiente colaborativo, ou seja, é possível compartilhar para edição múltipla. Esse ambiente foi fortemente inspirado nos notebooks Jupyter e permite a programação em diversas linguagens, porém trabalha de forma otimizada com Python. Outra vantagem de utilizar essa ferramenta é a execução utilizando recursos de uma máquina disponibilizada pelo Google.
No Marketplace do Google temos a ferramenta Colaboratory , instale-a para iniciarmos.
Link para instalação: https://workspace.google.com/marketplace/app/colaboratory/1014160490159?pann=ogb
Após instalado, podemos realizar a criação de um novo notebook para iniciar a implementação. Acesse o link https://colab.research.google.com/ e clique em “Novo notebook”.
Com o notebook criado, iremos iniciar o tutorial instalando as dependências do nosso projeto.
Para executar a célula haverá um botão de play ao lado esquerdo.
A primeira execução demandará um tempo a mais do que as seguintes, pois fará a alocação dos recursos do Google.
Enquanto estiver executando haverá um ícone sinalizando onde antes havia o botão play. A execução com sucesso será sinalizada a esquerda do botão com um sinal de “certo” na cor verde.
Para incluir uma nova célula pode ser utilizado o botão logo abaixo da barra de menus, na parte superior esquerda do navegador. Temos a opção de incluir uma nova célula de Texto ou de Código.
Para facilitar iremos realizar a importação das bibliotecas de acordo com a necessidade, podendo ser refatorado posteriormente sem afetar o funcionamento.
Em seguida vamos setar as variáveis de ambiente e iniciar o Spark através de uma sessão do PySpark.
Antes de iniciar de fato o tratamento dos dados, segue um exemplo de como é criado um DataFrame no Spark.
Para prosseguir com nosso projeto, iremos utilizar uma base massiva de dados de CNPJs obtida no site da Receita Federal do Brasil. Essa base está dividida em CNPJ Empresa, CNPJ Estabelecimento e CNPJ Sócio. No site oficial essas bases estão divididas, iremos utilizar partes de cada uma delas.
Caso deseje conferir os dados, visite o site: https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/cadastros/consultas/dados-publicos-cnpj
Para facilitar estou disponibilizando uma pasta compartilhada com os arquivos utilizados no exemplo: https://drive.google.com/drive/folders/1FAQGlyvaA3uv_roqMIEHlzrCfCXwj6Yp?usp=sharing
Faça download dos arquivos e faça upload para uma pasta em seu drive.
No Colab temos a opção de conectar ao drive, faremos isso para utilizar os arquivos direto de uma pasta mapeada. Para isso siga as etapas:
1- Conectar conta ao Google Drive:
No menu arquivos temos 4 ícones, clique no terceiro para conectar a conta. Para prosseguir será preciso conceder permissões para acessar o Google Drive.
Com isso uma nova pasta será apresentada, ‘drive’.
Acesse a pasta e verá a representação de hierarquia de pastas do Google Drive conectado.
Carregamento dos dados
Com isso seguiremos para o próximo passo, descompactar os arquivos. Para isso utilizaremos a biblioteca zipfile do Python.
Adeque os caminhos de acordo com a pasta onde salvou os arquivos em seu drive.
Agora iremos carregar os dados dos arquivos extraídos para um DataFrame do Spark, utilizando spark.read.csv().
Após executar o comando acima, teremos 3 DataFrames, ‘empresas’, ‘estabelecimentos’ e ‘socios’. Podemos contar os registros de cada um deles com o comando count(), como abaixo.
Manipulando os dados
Para iniciar vamos renomear as colunas com withColumnRenamed() e exibi-las com um print() no atributo columns.
Em seguida veremos os comandos limit() para limitar as linhas de exibição, toPandas() para conversão para DataFrame Pandas (apenas nessa exibição porque não está sendo atribuído a variável inicial) e printSchema() para exibir a estrutura do DataFrame (nome de coluna, tipo e atributo).
Agora iremos alterar tipo de dados, para isso utilizaremos mais recursos do pyspark.sql, como estruturas de dados e functions.
Iniciando com uma substituição de caracteres utilizando a function regexp_replace().
Outra function muito utilizada trata-se da conversão de dados do tipo String para data, informando o padrão que se encontram. Para isso utilizaremos a function to_date() junto ao cast().
Consulta de dados
O Spark possibilita a seleção de dados dentro do DataFrame com uma sintaxe similar a SQL. Veremos exemplos a seguir utilizando o .select() direto no DataFrame junto ao .show() para exibição.
Também podemos consultar valores nulos, nesse caso contando a quantidade de valores nulos para uma e em seguida para todas as colunas.
Nesse exemplo o .count() conta o número de ocorrências, .when() verifica a ocorrência e o .isnull() filtra valores nulos.
Para substituir os valores nulos será bem simples, observe, o .na.fill() realizará a substituição levando em conta o tipo da coluna.
Ordenando dados
Seguiremos com ordenação de dados utilizando um .orderBy().
Filtrando dados
Assim como no SQL, filtraremos os dados utilizando o .where(). Outras opções possíveis são o .filter() e a utilização em conunto com o .like().
Sumarizando os dados
Exemplos de como podemos sumarizar os dados estão apresentados abaixo.
Uma nova função é apresentada neste exemplo, a função .agg() é uma função de agregação.
Além destas formas, uma solução interessante para essa finalidade trata-se da função .summary(), se não passarmos o argumento todos os métodos serão exibidos, mas podemos definir quais nos interessam também.
Unindo DataFrames
A primeira forma de unir DataFrames é o método join().
Assim como no SQL, o join pode ter as orientações de inner, left, right ou outer.
Outra forma seria juntar os dados em um formato similar ao que seria um append, um DataFrame acima do outro. Segue exemplo:
Primeiro criamos um DataFrame denominado ‘freq’.
Em seguida utilizaremos um union() para unir esse DataFrame a um DataFrame com a somatória em um novo rótulo.
Utilizando o SparkSQL
A SparkSession criada no início do script possui o método .sql(), esse método permite fazermos consultas SQLs utilizando instruções no padrão desta linguagem.
Vamos começar criando uma View com os dados do DataFrame ‘empresas’ e consultando os dados posteriormente.
Visto isso, temos a possibilidade de criar consultas mais complexas utilizando da sintaxe do SQL.
Exportando dados do Spark
Iniciamos o projeto importando dados externos, agora para finalizar iremos ver como exportar os dados.
Começando pelo mesmo formato que consumimos no início, para exportar em CSV temos:
Como vemos nos argumentos, indicamos o caminho onde salvar, o modo de escrita, o separador a ser utilizado e que deve ser exportado com cabeçalho.
Outro formato possível, e muito utilizado com o Spark, são os arquivos Parquet. Em seguida temos como exportar nesse formato:
Para abrir este tipo de arquivo é bem similar, sendo:
Com isso finalizamos nossa jornada pelo básico de Spark, cada subtópico poderia ser explorado muito a fundo, essa ferramenta é muito poderosa e flexível.
Junto aos dados no Drive há uma cópia do Notebook que montei junto a este pequeno tutorial, sintam-se a vontade para copiar e testar tudo.
Agradeço por sua atenção e até mais!
Referências
https://cloud.google.com/learn/what-is-apache-spark?hl=pt-br
https://www.devmedia.com.br/introducao-ao-apache-spark/34178
https://learn.microsoft.com/pt-br/dotnet/spark/what-is-spark
https://spark.apache.org/docs/latest/api/python/reference/index.html