DEV Community

Fabio Simoes
Fabio Simoes

Posted on

Tutorial Duckdb

Duckdb é um banco de dados OLAP. Que em resumo é um sistema de banco de dados voltado para consultas. Não necessita de uma rede complexa de servidores para funcionar, e desempenha seu papel de maneira surpreendentemente rápido.

Características

Simplicidade: É muito simples instalar, seja de distribuir, pois não possui dependências externa, roda no mesmo processo do aplicativo principal, ou como um binário único.

Portável: Tem versões para Linux, Windows e macOS, nas arquiteturas x86 ou ARM. É altamente escalável, o que significa que conforme surgir a necessidade ele pode trabalhar com mais CPUs e memória. Tem APIs para Java, C, C++, Go, Node.js entre outras linguagens. É altamente integrado ao Python e R, nessas linguagens funciona é como se você estivesse utilizando Pandas, por exemplo.

Recursos: Com Duckdb usamos um SQL, com uma alta gama de recursos disponíveis. Ele pode ler diretamente arquivos no formato CSV, Parquet e JSON, em arquivos locais, e também a partir de locais remotos como buckets S3.

Rápido: As consultas rodam extremamente rápido graças ao seu motor colunar que suporta consultas em paralelo e pode processar volumes maiores que a memória.

Extensível: Permite o desenvolvimento e instalação de extensões de terceiros, para acrescentar suporte a novos tipos de dados, funções, e formatos de arquivos.

Grátis: É um projeto open source sob a licença MIT.

A seguir quero demonstrar como utilizar o Duckbd para fazer consultas. Ele pode ser um ótimo substituto para bibliotecas como Pandas, e muito útil para estudantes que querem aprender SQL, também para analistas que precisam fazer consultas, já conhecem SQL, e querem evitar a curva de aprendizado para o Pandas, o PySpark, por exemplo.

Nunca vou dizer a ninguém que devem evitar aprender qualquer coisa, mas pensando em Pandas e suas limitações, em especial para datasets maiores, em vários cenários o o Duckdb será uma ferramenta muito mais util, tanto do ponto de vista de aprendizado, quanto de resultados.

Sem mais delongas, vamos para o tutorial.

Instalação

Para esse projeto vou considerar que você já tenha Python, e pip instalados.
Primeiro crie uma pasta para o projeto, vamos criar um ambiente virtual para o nosso projeto.

python -m venv .venv
Enter fullscreen mode Exit fullscreen mode

Agora vamos ativar o ambiente virtual:

source .venv/bin/activate
Enter fullscreen mode Exit fullscreen mode

No Windows não é necessário usar o comando "source".

Para instalar o Duckdb use o comando abaixo:

pip install duckdb==0.9.2
Enter fullscreen mode Exit fullscreen mode

Agora vamos instalar o JupyterLab:

pip install jupyterlab
Enter fullscreen mode Exit fullscreen mode

Para iniciar o JupyterLab, use o comando abaixo:

jupyter lab
Enter fullscreen mode Exit fullscreen mode

Image description

Agora vamos criar um novo notebook e testar se o Duckdb esta funcionando como esperado. No novo notebook execute os comandos abaixo, se receber a mesma mensagem o ambiente esta corretamente configurado e podemos partir para os próximos passos.

Image description

Base de Dados

A base de dados que vamos utilizar nesse tutorial pode ser encontrada no seguinte endereço: Kaggle - Brewery Operations. É uma base de dados grande, então podemos analisar também o desempenho do Duckdb.

Faça o download da base de dados, e no mesmo diretório do projeto crie uma pasta chamada data e copie o arquivo para lá.

Agora vamos usar o Duckdb para ler os dados a partir do arquivo csv que acabamos de fazer o download.

Abaixo podemos observar o retorno da leitura, alguns registros serão exibidos como amostra.

Image description

Podemos também aplicar algumas consultas SQL diretamente lendo do csv. Como nos exemplos abaixo:

Contando registros

Image description

Filtrando registros

Image description

Ingestão de dados

O que fizemos até o momento foi usar os recursos do Duckdb na leitura de um arquivo csv. Pode ser feito exatamente o mesmo para outros tipos de arquivos, como parquet, json, entre outros.

Mas é possível fazer a ingestão desses dados no Duckdb. Com isso vamos ganhar mais desempenho nas nossas consultas. Depois é possível persistir esses dados no formato do Duckdb, o que irá facilitar a leitura dos dados em um próximo momento.

Criando a base de dados

O comando abaixo irá gerar um arquivo chamado tutorial.db no mesmo local onde o notebook foi criado. O extensão do arquivo não precisa ser necessariamente db, pode ser duckdb, ou qualquer outra que você deseje, desde que seja criada usando o comando abaixo.

con = db.connect("tutorial.db")
Enter fullscreen mode Exit fullscreen mode

O comando acima irá criar o arquivo .bd apenas se ele não existir, senão ele irá se conectar a esse banco de dados. Logo a partir da sua criação podemos usar ele para criar novas tabelas fazer consultas sempre que for necessário.

Esse banco de dados ainda não tem tabelas nele, o que vamos fazer agora é usar os dados do arquivo csv para criar uma tabela nele.

Para criar uma tabela no banco de dados, a partir do arquivo csv, vamos usar o comando abaixo:

con.sql("create table brewery_data as from 'data/brewery_data_complete_extended.csv'")
Enter fullscreen mode Exit fullscreen mode

O comando acima ira criar uma tabela no banco de dados chamada brewery_data, contendo todos os dados que estavam no arquivo csv serão gravados nessa tabela.

Se você tiver algum cliente SQL instalado no seu computador, como o DBeaver, por exemplo, poderá inclusive utiliza-lo para fazer consultas nesse banco de dados.

Image description

Ou ainda diretamente do Jupyter com Python conforme exemplo abaixo:

Image description

A partir de agora podemos sempre usar o banco de dados criado sempre que precisarmos sem a necessidade de ler diretamente do arquivo csv. Isso trás alguns benefícios, o primeiro é que todas as consultas serão muito mais rápidas.

Faça a contagem dos registros, diretamente na tabela do no Duckdb e compare com o tempo que levou quando executado a partir do csv.

con.sql("select count(*) as n_reqs from brewery_data")
Enter fullscreen mode Exit fullscreen mode

Outro ponto, é que o arquivo csv que utilizamos tem 2.6 GB, o arquivo do Duckdb ficou menos de 1 GB, já estamos economizando espaço em disco.

Criando tabelas a partir de dados filtrados

Agora que temos um banco de dados criado (tutorial.db), podemos criar novas tabelas dentro dele. Ao invés de gerar diferentes arquivos quando queremos separar os dados, podemos fazer isso dentro do banco, criando novas tabelas, como no exemplo abaixo:

con.sql("create table lagers as from brewery_data where Beer_Style = 'Lager'")

con.sql("select * from lagers")
Enter fullscreen mode Exit fullscreen mode

O que faço aqui é criar uma nova tabela, a partir da nossa tabela brewery_data, filtrando apenas as cervejas do tipo Lager, e inserindo esses registros em uma nova tabela. Tudo vai se manter dentro de um único arquivo, e conforme citado anteriormente pode ser facilmente consumido por uma ferramenta de relatórios, por exemplo.

Exportando Dados

Exportar dados, também pode ser feita de maneira bastante simplificada, veja os exemplos abaixo:

No exemplo abaixo, o conteúdo da tabela lagers, será exportado para o arquivo lagers.csv:

con.sql("select * from lagers").write_csv('lagers.csv')
Enter fullscreen mode Exit fullscreen mode

Seguinte a mesma lógica podemos exportar os dados para um arquivo no formato .parquet:

con.sql("select * from lagers").write_parquet('lagers.parquet')
Enter fullscreen mode Exit fullscreen mode

Conclusão

O objetivo principal desse tutorial era demonstrar alguns dos muito recursos do Duckdb.
Duckdb é com certeza uma ferramenta muito poderosa, escalável, e pode ser utilizada em diferentes tipos de projetos.
Uma ferramenta como o Duckdb entrega dinamismo, pois é muito simples ler dados de diferentes fontes, e aplicar a linguagem SQL, muito conhecida de profissionais da área de análise de dados.
Embora não tenha sido demonstrado nesse tutorial, o Duckdb permite a rápida conversão de uma query SQL para um data frame de Pandas, ou Polars, por exemplo, o que facilita o trabalho de cientistas de dados que depois de fazer o trabalho de limpeza dos dados, necessitem desses dados no formato Pandas, por exemplo, para aplicação de algorítimos de machine learning.
Teste o Duckdb, você vai conhecer uma ferramenta muito poderosa.

Top comments (1)

Collapse
 
marcooliveira profile image
Marco Aurélio Moraes de Oliveira

Excelente post @fsimoes!!! Obrigado por compartilhar seu conhecimento, aguardo mais rsrsrs..