Banco de dados Data Engineering Python

Manipulando Dados no MongoDB com Python

manipulando_dados_no_mongo_com_python

Fala Galera do mundo dos dados, hora de manipular dados no MongoDB com Python. Dessa forma, seguimos na missão de fazer uma introdução aos bancos de dados NoSQL com Python. O Mongo, assim como outros bancos de dados NoSQL tem grande potencial para atender as soluções de Big Data. Portanto, é bem importante para os engenheiros e analistas de dados saber como funciona o MongoDB. 

Aqui você vai ver:

  • O que é o banco de dados MongoDB
  • Qual biblioteca Python para manipular dados no MongoDB
  • Como criar um banco de dados MongoDB com Docker 
  • Como fazer uma conexão do Python com MongoDB 
  • Como criar base de dados e coleções no MongoDB com Python 
  • Como inserir dados em uma coleções do MongoDB com o Python 
  • Como consultar dados de uma coleções no MongoDB com o Python 
  • Como inserir e consultar dados no MongoDB com Spark 
  • Conectar ao MongoDB com o Mongo Express

Então, vamos ao que interessa! Partiu, conhecer um pouco mais do banco de dados MongoDB.

Banco de Dados MongoDB

MongoDB é um software de banco de dados orientado a documentos livre, de código aberto e multiplataforma. O MongoDB usa documentos semelhantes a JSON com esquemas. É desenvolvido pela MongoDB Inc. e publicado sob uma combinação da GNU Affero General Public License e Licença Apache. Suas características permitem com que as aplicações modelem informações de modo muito mais natural, pois os dados podem ser aninhados em hierarquias complexas e continuar a ser indexáveis e fáceis de buscar.

A estrutura de dados do MongoDB é de fácil entendimento e usa como base o formato json, ele é estruturado em databases, onde cada base desse tem as suas coleções e cada coleção tem os seus documentos. Na imagem abaixo você pode ver a representação gráfica desta estrutura de dados do Mongo. 

Apesar da forma de manipular os dados não ser a linguagem SQL (Structured Query Language) igual aos bancos relacionais,com Python é bem tranquilo. Mas precisaremos de uma biblioteca para trabalhar com Mongo no Python. 

A Biblioteca PyMongo

A lib PyMongo é uma distribuição Python que contém ferramentas para trabalhar com MongoDB. É uma biblioteca simples e fácil de utilizar, com uma documentação bem completa. Para a instalação da biblioteca, utilizamos o comando abaixo.

pip install pymongo

Agora é hora de manipular dados no MongoDB com Python no Dados ao Cubo!

Manipulando Dados no MongoDB com o Dados ao Cubo

Com a lib PyMongo instalada acima configuramos o nosso ambiente Python para trabalhar com Mongo. Mas, se você ainda não tem um banco de dados Mongo para conectar, faremos a configuração de um banco MongoDB com docker para os nossos estudos. 

Criar Banco Mongo com Docker

Aqui, precisaremos do docker para instalação do Mongo. Se ainda não utiliza o docker, pode instalar seguindo a documentação oficial da plataforma. Com Docker instalado seguimos os três passos a seguir, primeiro baixamos a imagem do Docker, em seguida criamos uma Network e finalizamos com a execução da imagem do MongoDB. 

### Baixando a imagem docker do Mongo
docker pull mongodb/mongodb-community-server
### Criar network
docker network create dadosaocubo
### Cria container docker Mongo
docker run 
  --name mongo 
  --network dadosaocubo 
  -p 27017:27017 
  -e MONGO_INITDB_ROOT_USERNAME=dadosaocubo 
  -e MONGO_INITDB_ROOT_PASSWORD=dados123 
  -d mongodb/mongodb-community-server:latest

Com esses três passos já é possível conectar ao Mongo com Python. Vale lembrar, que a criação do Network não é um passo obrigatório mas como utilizaremos outra ferramenta também no docker para conectar ao MongoDB, Esse passo é importante para essa comunicação entre duas imagens dentro do Docker. Seguimos agora para o código Python. 

Bibliotecas para Manipular MongoDB com Python

Para trabalhar com o MongoDB no Python, precisaremos de algumas bibliotecas para serem importadas. Aqui separei em três blocos as bibliotecas, primeiro a biblioteca de comunicação do MongoDB com python, na sequência duas bibliotecas para consumir dados de uma API e por fim a biblioteca para trabalhar com MongoDB no PySpark.

# importa bibliotecas do mongo
from pymongo import MongoClient
# importa bibliotecas para consumir dados da API
import requests
import json
# importa bibliotecas do spark
from pyspark.sql import SparkSession, functions as f

Com todas as bibliotecas importadas podemos começar a nossa aplicação Python com Cassandra. 

Conexão do Python com o MongoDB

Primeiramente, faremos conexão no MongoDB com o Python. Aqui usamos a função MongoClient responsável pela autenticação e que irá realizar a conexão do Python com o MongoDB. Passamos para a função a uri de conexão com o banco com os dados de usuário, senha, endereço e porta.

# conexão do python com o mongo
user = 'dadosaocubo'
pasw = 'dados123'
host = 'localhost'
port = '27017'
uri = f"mongodb://{user}:{pasw}@{host}:{port}"
client = MongoClient(uri)

Com a comunicação estabelecida, podemos seguir para a criação da estrutura do banco MongoDB. Agora, todos os comandos no MongoDB através do Python será através da variável client

Criando Base de Dados no MongoDB com Python

O Mongo, trabalha com conceito de database, algo análogo a um database nos bancos relacionais. Com comando Python abaixo, podemos listar todos os databases disponíveis no Mongo. 

# lista todos os dbs disponíveis
client.list_database_names()

Caso database ainda não esteja criado, podemos criar um database no Mongo utilizando Python. Confere o código a seguir para a criação de um database, passando a conexão e nome da base de dados.

# criar um novo db
db = client["db_dadosaocubo"]

Se precisar deletar o database no Mongo, também conseguimos fazer utilizando o Python, Confere o código abaixo com a função drop_database.

# deletar dbs
client.drop_database("db_dadosaocubo")

Agora que já temos a estrutura do database construída, podemos criar as nossas coleções dentro dele. 

Criando Coleção no MongoDB com Python

Antes de criar uma collection, iremos conferir como listar todas as coleções disponíveis no MongoDB. Para isso utilizamos o comando Python a seguir com a função list_collection_names

# listar collections dos dbs
client.d3.list_collection_names()

Mas, se precisar criar uma nova collection no MongoDB com Python, utilizamos database com o nome da nova coleção.

# criar uma collection no mongo
collection = db["users"]

E para deletar uma coleção existente, também temos função drop conforme o código a seguir.

# deletar coleções
collection = db["users"]
collection.drop()

Agora que já criamos a estrutura do banco MongoDB utilizando o Python, é hora de inserir os dados. 

Inserindo Dados no MongoDB com Python

Para inserir dados no MongoDB utilizando Python, podemos fazer isso de diversas formas. primeiro veremos a forma mais simples, utilizando a função insert_one da lib PyMongo. 

# inserir um documento
dict_user = { "name": "Dias", "city": "Salvador" }
collection.insert_one(dict_user)

Agora um confere simples de tudo que fizemos até aqui, listar todas as bases de dados, as coleções da base de dados criada e o documento inserido acima.

# listar db, collection e documento
print(f'Todas as bases --> {client.list_database_names()}')
print(f'Coleções de uma base --> {client.db_dadosaocubo.list_collection_names()}')
print(f'Primeiro documento de uma coleção --> {collection.find({})[0]}')

E então temos esse resultado na imagem abaixo.

Mas, para grandes volumes de dados essa talvez não seja a melhor solução. Então veremos como inserir dados no MongoDB com o PySpark. 

Inserindo Dados no MongoDB com Spark

Iremos dividir esta etapa em 3 pedaços, primeiro a criação da sessão Spark, segundo o consumo de dados de uma APIe terceiro inserir os dados no banco com Spark.

Criar Sessão Spark

Para utilizar o Spark, inicialmente precisamos criar uma sessão através do código abaixo, se não sabe nada sobre Spark, leia o artigo aqui do Dados ao Cubo sobre como preparar ambiente PySpark com exemplos. Um detalhe importante a ser ressaltado são os pacotes do MongoDB que passamos na configuração do Spark. 

# criar sessão spark
spark = (SparkSession.builder\
           .config("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.12:3.0.1")\
           .getOrCreate() )

Consumir dados de uma API

Agora é hora de conseguir uma base de dados digna para inserir os dados no MongoDB. Dessa forma, iremos consumir os dados de uma API com informações de NCM (Nomenclatura Comum do Mercosul).

Abro um parênteses, para destacar a qualidade da origem dos dados do projeto Brasil API. Um projeto experimental, que tem como objetivo centralizar e disponibilizar endpoints modernos com baixíssima latência independente de sua fonte para transformar o Brasil em uma API.

O código a seguir, para requisição em um API e retornará o resultado da variável objeto. Se quiser saber um pouco mais de como trabalhar com API e Python Confere o artigo ingestão de dados via API com Python

# consumindo dados de uma API
url = f'https://brasilapi.com.br/api/ncm/v1'
resposta = requests.request("GET", url)
objetos = json.loads(resposta.text)

Agora, uma breve verificação se os dados retornaram com sucesso, acessando o primeiro registro da lista objetos. 

# verificando o primeiro registro
objetos[0]

E então, temos o resultado na imagem abaixo. 

Na sequência, faremos a transformação dos dados da API em um DataFrame Spark.

# transfomando dados da API em dataframe spark
df_ncm = spark.createDataFrame(objetos)

Para verificar se a transformação do DataFrame foi correta, podemos exibir as primeiras linhas através do comando show.

# verifica as primeiras linhas
df_ncm.show(5, truncate=False)

Dessa forma, já temos o dado em um DataFrame Spark conforme a imagem abaixo. 

Inserir Dados no Cassandra com Spark

Vamos criar uma nova uri de conexão com o banco com os dados de usuário, senha, endereço e porta, igual fizemos na conexão, mas acrescentamos o database e a collection onde iremos escrever os dados no banco.

# montar uri para autenticar mongo com o Spark
user = 'dadosaocubo'
pasw = 'dados123'
host = 'localhost'
port = '27017'
database = 'db_dadosaocubo'
collection = 'ncm'
uri = f"mongodb://{user}:{pasw}@{host}:{port}/{database}.{collection}?authSource=admin"

Agora podemos utilizar o comando write do Spark, para escrever o DataFrame no MongoDB com PySpark. Alguns detalhes importantes no format informamos o formato de escrita dos dados. No option informamos a uri com os dados de conexão. E o mode overwrite (sobrescrever) e finalizamos com o save para salvar os dados no Mongo. 

# inserir dados no mongo com o Python
df_ncm.write.format("com.mongodb.spark.sql.DefaultSource")\
   .mode("overwrite")\
   .option("uri",uri)\
   .save()

Depois de inserir, podemos consultar os dados no MongoDB com o Python. 

Consultando Dados no MongoDB com Python

Também podemos consultar os dados no MongoDB utilizando Python de diversas formas. primeiro veremos a forma com o PyMongo, utilizando o comando find

cursor = collection.find({})
for document in cursor:
   print(document)

Porém, se estivermos trabalhando com grandes volumes de dados talvez tenhamos soluções melhores, hora de conferir como consultar os dados no MongoDB com PySpark. 

Consultando Dados no MongoDB com Spark

Aqui utilizamos o comando read do Spark, para ler os dados no MongoDB com PySpark. Também colocamos format para o Python saber o formato de leitura dos dados. No option Informamos a string de conexão de onde queremos ler no Mongo. Finalizamos com o load para carregar os dados do MongoDB no DataFrame Spark.

# ler dados no mongo com o Python
df_ncm_read = spark.read\
               .format("com.mongodb.spark.sql.DefaultSource")\
               .option("uri", uri)\
               .load()

Para verificar o DataFrame, podemos exibir as primeiras linhas através do comando show.

# visualizar as primeiras linhas
df_ncm_read.show(5)

E assim, já temos os dados formatados e prontos para manipulação com o Spark. 

Para fechar com chave de ouro uma dica bônus para quem gosta de uma ferramenta visual de manipulação de banco de dados. Confere a seguir, como manipular os dados do MongoDB com o Mongo Express.

Mongo Express

Aqui, também vamos utilizar o docker para instalação do Mongo Express. Com o único comando docker run com alguns parâmetros, subiremos uma imagem da aplicação e podemos acessar ela no localhost:8081.

### Mongo Express
docker run 
  --name mongo-express 
  --network dadosaocubo 
  -e ME_CONFIG_MONGODB_SERVER=mongo 
  -e ME_CONFIG_BASICAUTH_USERNAME=dadosaocubo 
  -e ME_CONFIG_BASICAUTH_PASSWORD=dados123 
  -e ME_CONFIG_MONGODB_ADMINUSERNAME=dadosaocubo 
  -e ME_CONFIG_MONGODB_ADMINPASSWORD=dados123 
  -p 8081:8081 mongo-express 

Após executar o Mongo Express, já temos a conexão com MongoDB, e já são exibidas as bases de dados conforme imagem abaixo. 

Ao clicar para ver uma base de dados, são exibidas todas as coleções.

Acessando a coleção, podemos consultar os documentos.

E ainda, verificar cada documento no detalhe.

E então, chegamos ao fim desse passo a passo de como manipular o MongoDB com Python. 

MongoDB com Python ao Cubo

Agora você já sabe o que é o banco de dados MongoDB e de onde surgiu. Qual biblioteca Python para manipular dados no MongoDB e como instalar ela. Criar um banco de dados MongoDB com Docker de forma prática. Fazer uma conexão do Python com MongoDB. Criar base de dados e coleções no MongoDB com Python, também como deletar. Inserir dados em uma coleções do MongoDB com o Python. Consultar dados de uma coleções no MongoDB com o Python. Inserir e consultar dados no MongoDB com Spark. E para completar conectar ao MongoDB com o Mongo Express uma ferramenta visual para o MongoDB. Top em? Mas é só o começo! Um abraço e até a próxima.

Conteúdos ao Cubo

Então, se você curtiu o conteúdo, aqui no Dados ao Cubo tem muito mais. Então, deixo algumas sugestões de conteúdos que você pode encontrar. Sempre falando sobre o mundo dos dados!

Portanto, para finalizar, se torne também Parceiro de Publicação Dados ao Cubo. Escreva o próximo artigo e compartilhe conhecimento para toda a comunidade de dados.

Gostou? Compartilhe!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *