Operações de leitura/gravação Pyspark com DocumentDB

Gustavo Tavares
A3data
Published in
5 min readMar 6, 2023

1. Introdução

Neste artigo vou passar um pouco mais pela parte técnica do processo em que vou fazer operações simples como Leitura e Gravação no DocumentDB com Pyspark, configuração do ambiente, drivers e também disponibilizar um código base para facilitar o desenvolvimento dessa interação.

2. MongoDB

MongoDB é um banco de dados não relacional voltado a documento, diferente dos bancos de dados tradicionais que seguem o modelo relacional, com isso já temos uma primeira diferença entre os dois onde o banco relacional é representado atraves de duas dimensões (bidimensional): linha e coluna, já o banco voltado a documento lida com dados em estruturas de documento como o JSON.

Podemos saber mais sobre o que é um banco de dados voltado a documentos no site oficial do MongoDB.

3. DocumentDB

DocumentDB é um banco de dados NoSQL voltado a documentos e semelhante ao MongoDB, sendo assim, podemos utilizar sua estrutura de leitura e escrita para nos auxiliar.

O modelo de banco de dados voltado a documentos funciona bem com casos de uso como catálogos, perfis de usuários e sistemas de gerenciamento de conteúdo, onde cada documento é único e evolui com o passar do tempo.

Podemos saber mais sobre ele com a documentação da AWS.

4. Diferença entre o DocumentDB e o MongoDB

O DocumentDB, desenvolvido pela Amazon em 2019, é um serviço de banco de dados com armazenamento de documentos rápido, confiável, escalável e totalmente gerenciável e compatível com MongoDB. Ele implementa a API do MongoDB 3.6 e o ​​Apache Server 2.0 emulando as respostas. O MongoDB, desenvolvido pela MongoDB Inc em 2009, é um banco de dados de documentos de código aberto que armazena os dados em documentos semelhantes a JSON. Permite o manuseio de grandes volumes de dados e oferece flexibilidade aos usuários em diversas formas, seja esquema, linguagens de programação, sistemas operacionais, etc. Utiliza uma excelente linguagem de consulta para filtrar os dados de acordo com o requisito, por mais aninhados que estejam.

Embora o DocumentDB ofereça suporte a alguns recursos do MongoDB, é importante observar que ele não é totalmente compatível.

  1. DocumentDB é um banco de dados comercial enquanto o MongoDB um banco de dados de código aberto.
  2. O dimensionamento automático de dados é suportado no DocumentDB, pois os usuários podem dimensionar de 10 GB a 64 TB sem nenhum esforço.
  3. O escalonamento de dados é um tanto difícil para os usuários que usam o banco de dados MongoDB.
  4. O Amazon DocumentDB fornece tolerância a falhas dividindo os volumes de armazenamento em segmentos de 10 GB que estão espalhados por vários discos. Ele usa a abordagem de dimensionamento para isso.
  5. O MongoDB também fornece uma melhor capacidade de tolerância a falhas por meio da replicação do MongoDB, que permite que o sistema continue funcionando corretamente. MongoDB suporta Sharding para distribuir a carga.

Tanto o MongoDB como a plataforma cloud AWS tem artigos falando sobre a comparação entre os dois.

5. Pyspark

Pyspark é uma interface python para o Apache Spark ele facilita e intermedia a o uso das funcionalidades do spark assim conseguimos usar recursos avançados de uma forma mais fácil, como enviar processos para serem distribuídos, trabalhos com grandes quantidades de dados.

6. Pyspark Configuração e Drivers

Aqui estou importando as bibliotecas necessárias, SparkSession para iniciar a sessão spark e SparkContext para adicionar os drivers.

from pyspark.sql import SparkSession
from pyspark import SparkContext

Depois de importar as bibliotecas podemos criar a Seção spark, dar um nome para o app e configurar os jars, assim conseguimos iniciar nosso processo.

spark = SparkSession.builder.appName('pr_documentdb') \
.enableHiveSupport() \
.master('local') \
.config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.12:3.0.1') \
.config('spark.mongodb.input.uri', 'mongodb://127.0.0.1/test.myCollection?readPreference=primaryPreferred"') \
.config('spark.mongodb.output.uri', 'mongodb://127.0.0.1/test.myCollection') \
.getOrCreate()

Para conseguirmos fazer a conexão com o banco vamos precisar adicionar alguns jars que seram nessesarios para que o conector do MongoDB funcione perfeitamente.

Caso seu ambiente não tenha alguns dos jars essenciais, é possivel fazer o download deles, pra isso podemos usar mvnrepository.

spark.sparkContext._conf.getAll()
spark.sparkContext.addPyFile("/opt/spark/jars/mssql-jdbc-10.2.0.jre8.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/bson-4.3.1.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/mongodb-driver-core-4.3.1.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/zeppelin-mongodb-0.9.0.jar")
spark.sparkContext.addPyFile("/opt/spark/jars/mongo-java-driver-3.12.10.jar")

Agora é só fazer a leitura do documento, vamos passar o endereço do DocumentDB, database e coleção.

df = spark.read.format("mongo") \
.option("uri", "mongodb://user:endereco@ip:porta/database.collection") \
.load()

df.printSchema()

Podemos também com a mesma estrutura fazer a inserção de dados, vamos passar o endereço do banco, database e coleção, assim como do código acima

df.write.format("mongo").mode("append").save()

Como vemos acima estamos usando a conexão do Mongo para fazer a interação entre o Pyspark e o DocumentDB, pois ele implementa a API do MongoDB, assim podemos fazer a leitura e escrita no banco dessa forma.

7. Alguns dos possíveis erros

  • Erro de versão entre mongo, Spark, em algumas versões será necessário usar o formato como “mongo”, “mongodb” ou também “com.mongodb.spark.sql.DefaultSource”
  • Erro de algum driver faltante, os mais necessários coloquei acima se caso seu ambiente não tenha, pode ser baixado o jar pela web.
  • Permissão de conexão ao banco.

Para solução de alguns erros podemos verificar na documentação do MongoDB.

8. Referências

--

--