Engenharia de dados — Como substituir Python por Clojure

Marina Cavalari
4 min readDec 22, 2021

--

Quando comecei a estudar mais sobre engenharia de dados, eu só me deparava com conteúdos em Python, e isso sempre me deixou um pouco incomodada, pois eu tinha curiosidade por outras linguagens. Quando comecei minha migração de carreira, comecei a trabalhar com Python, e mesmo com todas as libs e facilidades que a linguagem apresentava, nunca foi a minha favorita, acredito que tenha sido por causa da forma como ela foi me apresentada e o jeito que a gente codava mesmo.

Quando entrei no Nubank, fui alocada em uma área regulatória, mas quem me conhece sabe que eu sempre quis fazer parte da área de dados, e assim foi feito, consegui uma realocação para Data-Access/Bi-Platform.

O desafio agora era, como criar aplicações em Clojure para interagir com sistemas de big-data: clouds, Spark, Plataformas, etc. Aqui nós temos várias aplicações sendo usadas e acessadas via serviços Clojure, mas como fazemos isso? Vou demonstrar com um exemplo prático, acessando a API do Databricks, uma ferramenta de analytics, inteligência artificial e mais, muito utilizada em várias empresas do Brasil e do exterior (Aqui no Brasil temos exemplos de empresas que usam: XP, Ambev, Apple, etc).

Dessa forma, podemos acessar a API através de endpoints usando qualquer linguagem, e os exemplos abaixo mostram a usabilidade em Python e Clojure, respectivamente:

As linguagens no geral possuem similaridade, como é o caso dos requires e imports, mas isso é o uma das poucas coisas que as aproxima. Enquanto o Python, pode ser usado na forma de scripts ou orientação a objetos, ainda vemos que a forma mais comum utilizada em algumas empresas é a criação de scripts em um único arquivo, ao invés de quebrar em classes, no Clojure é uma boa prática a criação de namespaces, o que mantem uma melhor organização do código e também facilita na manutenção do mesmo, e como o número de empresas utilizando Clojure é bem menor que Python, o padrão correto da linguagem ainda se mantém estável.

Dessa forma, o objetivo dessa mini demonstração será: listar todos os clusters de uma determinada conta do Databricks e replicá-los em uma outra conta, a fim de simular uma clonagem de clusters, e também filtrar esses clusters para que as informações sejam apenas de clusters criados para rodar análises/códigos, e não informações de clusters de jobs, que são criados automaticamente pela automação de schedule de jobs do próprio Databricks.

Podemos começar da seguinte forma, definindo as chamadas e endpoints que serão acessados em ambas as linguagens e comparando-as:

No código acima, em Clojure, vemos a definição de todas as funções básicas para que seja possível acessar a API e seus endpoints, que no nosso caso são os de listagem e criação de clusters, podemos entender esse arquivo como uma das portas dentro da arquitetura hexagonal, pois ela é responsável por fazer as requisições.

Abaixo, podemos encontrar o código para listar e criar clusters em Python:

No entanto, em Clojure o código se torna bem mais sucinto, uma vez que já temos a namespace da API separada:

Ambos os códigos irão listar os clusters e criá-los. Porém, as configurações estão em lugares separados, o que também poderia ter sido replicado no Python, mas não é o mais visto. Uma das vantagens do Clojure é a sua praticidade na hora de construir um loop e também na hora de iterar sobre ele, com apenas duas funções que se aproveitam da praticidade e poder das funções core do Clojure de map , remove , merge e select-keys nós conseguimos realizar toda a tratativa e criação em 10 linhas de código, sem contar as quebras de linha. O que torna o código muito mais simples, conciso e diminui a manutenção e horas investidas em desenvolvimento. Enquanto no Python, temos um código um pouco mais verboso e de maior complexidade para entendimento, dentro do loop de iteração. Além disso, dentro da estrutura do Clojure, é bem mais difícil criar códigos mutáveis, isso por que o Clojure nos leva a criar funções para lidar com tipos de estruturas de dados diferentes, então temos muito mais pureza nas funções, enquanto no Python, podemos ver mais comumente variáveis e estruturas sendo alteradas enquanto o código é rodado por exemplo, e isso implica em vários problemas e até mesmo dificulta a testagem em muitas ocasiões. Já trabalhei em muitos projetos Python onde as variáveis eram re-declaradas inúmeras vezes, e os códigos eram gigantes, dessa forma a compreensão e manutenção do código também tinha complexidade potencializada.

Na minha opinião, essa obrigatoriedade de que todo engenheiro de dados devem saber Python pode estar perto de não ser mais tão verdade assim, dado que muitas linguagens hoje oferecem possibilidades de uso com o ambiente de big data, além de Clojure ser uma ferramenta válida para esse tipo de integração e também micro-serviços, ele também já possui libs que nos possibilita trabalhar direto com o Spark, o Sparkling por exemplo, dentre muitas outras. Além disso, temos Scala por exemplo, que também deve entrar como uma skill obrigatória na lista de engenheiros de dados por aí.

Os códigos completos, que funcionam de verdade verdadeira, estão hospedados no meu github, e podem ser usados como forma de estudo ou prova de conceitos, além de sempre estarem abertos a sugestões e dúvidas :)

PS: No começo, Clojure pode parecer estranho e até mesmo difícil, mas a sua capacidade de escalar e a manutenção ser mais simplificada por conta da organização do código e suas peculiaridades em relação ao paradigma funcional, trazem benefícios a longo prazo pu até mesmo a curto prazo em organizações muito grandes.

--

--