Tutorial Duckdb
Tags: duckdb, sql, python
Published: 2024-04-29 21:44:40

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.

```bash
python -m venv .venv
```

Agora vamos ativar o ambiente virtual:

```bash
source .venv/bin/activate
```

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

Para instalar o Duckdb use o comando abaixo:

```bash
pip install duckdb==0.9.2
```

Agora vamos instalar o JupyterLab:

```bash
pip install jupyterlab
```

Para iniciar o JupyterLab, use o comando abaixo:

```bash
jupyter lab
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ib9321kdoycgch08dtld.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59sqvd9o1uowucebarfb.png)

# Base de Dados

A base de dados que vamos utilizar nesse tutorial pode ser encontrada no seguinte endereço: [Kaggle - Brewery Operations](https://www.kaggle.com/datasets/ankurnapa/brewery-operations-and-market-analysis-dataset). É 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q3h35bp7ugv30lbgg49t.png)

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

## Contando registros

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u7pgtr7l1h5kvxl3srpk.png)

## Filtrando registros

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4f0l495oidk5u8gu5zd4.png)

# 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.

```python
con = db.connect("tutorial.db")
```

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:

```python
con.sql("create table brewery_data as from 'data/brewery_data_complete_extended.csv'")
```

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ks6yg6784qgs0o6kw2b6.png)

Ou ainda diretamente do Jupyter com Python conforme exemplo abaixo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ny7dnkr3gz3lydb9qveu.png)

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.

```python
con.sql("select count(*) as n_reqs from brewery_data")
```

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:

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

con.sql("select * from lagers")
```

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*:

```python
con.sql("select * from lagers").write_csv('lagers.csv')
```

Seguinte a mesma lógica podemos exportar os dados para um arquivo no formato **.parquet**:
```python
con.sql("select * from lagers").write_parquet('lagers.parquet')
```

# 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.