Do conceito ao consumo de dados em escala com brickster, DBI e sparklyr
Clique em “Looking for Databricks Free Edition? Click here”
A conta é gratuita, sem cartão de crédito. O workspace leva menos de 5 minutos para ficar pronto.
Esta aula foi construída para que você entenda o que é o Databricks, onde ele se encaixa no ecossistema de engenharia de dados e como integrá-lo ao R usando
brickster,DBIesparklyr. Todo o código funciona com a conta gratuita Databricks Free Edition.
SITE OFICIAL > https://jenniferlopes.github.io/meu_site/
Engenharia de dados é a disciplina que constrói e mantém os sistemas pelos quais os dados trafegam, desde a coleta nas fontes originais até a entrega em formato confiável para análise, modelagem e tomada de decisão.
O engenheiro de dados não analisa os dados.
Ele garante que os dados estejam disponíveis, confiáveis, no formato correto e no momento certo para quem vai analisá-los.
Fontes (APIs, bancos, arquivos, sensores, eventos)
|
| Ingestão - extrair e carregar
v
Data Lake / Data Warehouse (armazenamento bruto)
|
| Transformação - limpar, modelar, agregar
v
Camada analítica (tabelas prontas para consumo)
|
| Entrega - BI, relatórios, modelos, APIs
v
Análise e decisão (R, Python, ferramentas de BI)
| Perfil | Responsabilidade principal |
|---|---|
| Engenheiro de dados | Construir pipelines de ingestão e armazenamento |
| Analytics engineer | Transformação, modelagem e qualidade dos dados |
| Cientista de dados | Modelagem estatística e machine learning |
| Analista de dados | Análise exploratória, visualização e relatórios |
O R foi projetado para análise de dados em uma única máquina. Seus limites práticos:
Apache Spark é o motor de processamento distribuído mais usado no mundo para dados em larga escala. Foi criado em 2009 na UC Berkeley e doado à Apache Software Foundation em 2013.
Como funciona:
Por que é rápido: o Spark mantém os dados em memória entre operações, evitando escritas em disco que tornavam o MapReduce (predecessor) lento.
| Componente | O que faz |
|---|---|
| Spark Core | Motor base: agendamento, memória, armazenamento |
| Spark SQL | Consultas SQL e DataFrames estruturados |
| Spark Streaming | Processamento de streams em micro-batches |
| MLlib | Machine learning distribuído |
| GraphX | Processamento de grafos |
Para o usuário de R, o Spark SQL é o componente mais relevante: é ele que o
sparklyrusa para executar operações dplyr em tabelas distribuídas.
Databricks é uma plataforma unificada de dados e IA construída sobre Apache Spark e Delta Lake. Foi fundada em 2013 pelos criadores do Spark na UC Berkeley.
O que o Databricks oferece além do Spark :
Unity Catalog é o sistema de governança centralizada do Databricks. Ele gerencia:
A estrutura hierárquica é:
Catálogo (catalog)
└── Schema (equivalente ao schema do PostgreSQL)
└── Tabela / View / Volume / Função
No workspace gratuito, o catálogo samples contém datasets de exemplo disponíveis para todos os usuários.
O data lakehouse é a arquitetura que o Databricks popularizou. Combina:
Data lake: armazena qualquer tipo de dado (estruturado, semi-estruturado, não estruturado), em qualquer escala, a baixo custo, em formato aberto (Parquet, Delta).
Data warehouse: oferece estrutura, governança, transações ACID, controle de acesso e desempenho otimizado para consultas SQL.
O Delta Lake é a camada técnica que permite essa combinação: ele adiciona transações ACID e governança sobre arquivos Parquet em um data lake.
| Característica | Databricks | Snowflake | BigQuery |
|---|---|---|---|
| Motor base | Apache Spark | Proprietário | Capacitor (Google) |
| Formato nativo | Delta Lake (aberto) | Proprietário | Proprietário |
| Machine learning | Nativo (MLflow) | Limitado | Via Vertex AI |
| Notebooks | Sim | Limitado | Sim |
| Integração R | brickster, sparklyr |
DBI + ODBC |
bigrquery |
| Plano gratuito | Free Edition | Trial 30 dias | Free tier |
Fontes externas
|
| Ingestão (Databricks, Airflow, dbt)
v
Delta Lake no Databricks
|
| Transformação SQL (dbt, notebooks Databricks)
v
Tabelas analíticas prontas
|
| R via brickster + DBI + dbplyr
v
Análise, modelagem, visualização
|
| Resultados via volumes
v
Databricks armazena e compartilha
A Databricks Free Edition é a versão gratuita atual do Databricks, lançada em 2025 como substituta da Community Edition (aposentada).
O que está disponível:
samplesLimitações importantes:
spark_apply(): o ambiente serverless não tem R instaladoPasso 1 - Acessar a página de cadastro:
https://www.databricks.com/try-databricks
Passo 2 - Procurar o link:
"Looking for Databricks Free Edition? Click here"
(não clique no trial de 14 dias)
Passo 3 - Escolher o método de cadastro:
Google, Microsoft ou e-mail
Passo 4 - Confirmar o e-mail se necessário
Passo 5 - O workspace é criado automaticamente
Aguardar alguns minutos até ficar pronto
Passo 6 - Acessar o workspace:
https://[seu-prefixo].cloud.databricks.com
Após entrar no workspace, você verá no menu lateral:
Para esta aula, o mais importante é localizar:
brickster via DBIsamples, com datasets de amostra disponíveis para todosO warehouse_id é necessário para conectar via DBI. Para encontrá-lo:
No workspace Databricks:
1. Clicar em "SQL Warehouses" no menu lateral
2. Clicar no warehouse "Serverless Starter Warehouse"
3. Ir na aba "Connection details"
4. Copiar o valor de "HTTP Path"
Exemplo: /sql/1.0/warehouses/abc123def456
O warehouse_id é a parte final:
abc123def456
O catálogo samples contém datasets gratuitos disponíveis em qualquer workspace Databricks:
| Tabela | Descrição | Linhas aprox. |
|---|---|---|
samples.nyctaxi.trips |
Viagens de táxi em Nova York | 21.000 |
samples.tpch.orders |
Pedidos de benchmark TPC-H | 1,5 milhão |
samples.tpch.lineitem |
Itens de pedido TPC-H | 6 milhões |
samples.tpch.customer |
Clientes TPC-H | 150.000 |
samples.lending_club.loan_stats |
Empréstimos Lending Club | 2,2 milhões |
Para esta aula usamos samples.nyctaxi.trips e samples.tpch.orders.
brickster é o toolkit R oficial para Databricks, publicado no CRAN em 2025. Foi desenvolvido pela equipe de engenharia do Databricks especificamente para usuários R.
O que ele oferece:
usethis::edit_r_environ()
# Adicionar as seguintes variáveis:
# DATABRICKS_HOST=seu-prefixo.cloud.databricks.com
# DATABRICKS_TOKEN=dapi... (Personal Access Token)
# DATABRICKS_WSID=123456789012345 (Workspace ID)
# Após salvar, reiniciar o R:
# CTRL + SHIFT + F10 (Windows/Linux)
# CMD + SHIFT + F10 (macOS)
Sys.getenv("DATABRICKS_HOST")No workspace Databricks:
1. Clicar no seu nome no canto superior direito
2. Selecionar "Settings"
3. Ir em "Developer" → "Access tokens"
4. Clicar em "Generate new token"
5. Dar um nome (ex: "R_brickster") e definir a validade
6. Copiar o token gerado (começa com "dapi...")
7. Colar no .Renviron como DATABRICKS_TOKEN
O token só aparece uma vez.
Salve imediatamente no .Renviron.
No workspace Databricks:
1. Acessar a URL do workspace no navegador
Exemplo: https://adb-1234567890123456.7.azuredatabricks.net
2. O Workspace ID são os números após "adb-"
Neste exemplo: 1234567890123456
Alternativa:
1. Settings → "General"
2. Procurar "Workspace ID" na página
Colar no .Renviron como DATABRICKS_WSID
Após open_workspace(), o painel Connections do RStudio mostra:
Databricks Workspace
└── Catalogs
├── hive_metastore
│ └── default
├── samples
│ ├── lending_club
│ │ └── loan_stats
│ ├── nyctaxi
│ │ └── trips
│ └── tpch
│ ├── customer
│ ├── lineitem
│ ├── nation
│ ├── orders
│ └── region
└── [seu workspace]
Clique em qualquer tabela para visualizar as colunas e tipos diretamente no RStudio.
# A tibble: 1 × 5
id name state cluster_size warehouse_type
<chr> <chr> <chr> <chr> <chr>
1 abc123def456789 Serverless Starter Warehouse RUNNING Small PRO
O campo id é o warehouse_id necessário para dbConnect(). O estado RUNNING indica que o warehouse está ativo e pronto para receber consultas.
<DatabricksSQL>
warehouse_id: abc123def456789
catalog: samples
schema: default
host: seu-prefixo.cloud.databricks.com
[1] "tpep_pickup_datetime" "tpep_dropoff_datetime"
[3] "trip_distance" "fare_amount"
[5] "pickup_zip" "dropoff_zip"
dbGetQuery(con, "
SELECT pickup_zip,
COUNT(*) AS total_viagens,
ROUND(AVG(trip_distance), 2) AS distancia_media,
ROUND(AVG(fare_amount), 2) AS tarifa_media,
ROUND(MEDIAN(fare_amount), 2) AS tarifa_mediana
FROM samples.nyctaxi.trips
WHERE fare_amount > 0
AND trip_distance > 0
GROUP BY pickup_zip
ORDER BY total_viagens DESC
LIMIT 10") pickup_zip total_viagens distancia_media tarifa_media tarifa_mediana
1 10001 1823 1.82 9.84 8.50
2 10036 1644 1.21 8.72 7.50
3 10019 1589 1.45 9.15 8.00
4 10017 1421 1.63 9.88 8.50
5 10022 1387 1.38 8.94 8.00
6 10011 1298 1.71 9.42 8.50
7 10014 1187 1.55 8.67 7.50
8 10013 1156 1.82 9.21 8.00
9 10016 1102 1.47 9.03 8.00
10 10018 1089 1.29 8.45 7.50
trips_db <- tbl(con, I("samples.nyctaxi.trips"))
resultado <- trips_db |>
filter(fare_amount > 0, trip_distance > 0) |>
mutate(
velocidade_mph = trip_distance /
(as.numeric(
tpep_dropoff_datetime - tpep_pickup_datetime) / 3600)) |>
group_by(pickup_zip) |>
summarise(
total_viagens = n(),
distancia_media = round(mean(trip_distance,
na.rm = TRUE), 2),
tarifa_media = round(mean(fare_amount,
na.rm = TRUE), 2),
.groups = "drop") |>
filter(total_viagens >= 100) |>
arrange(desc(tarifa_media)) |>
collect()
glimpse(resultado)Rows: 42
Columns: 4
$ pickup_zip <int> 10162, 10069, 10044, 10282, 10004, ...
$ total_viagens <int> 112, 287, 198, 156, 445, ...
$ distancia_media <dbl> 3.42, 2.87, 2.14, 2.98, 1.87, ...
$ tarifa_media <dbl> 18.94, 15.42, 13.87, 13.21, 12.98, ...
resultado |>
filter(total_viagens >= 200) |>
ggplot(aes(
x = distancia_media,
y = tarifa_media,
size = total_viagens,
color = tarifa_media)) +
geom_point(alpha = 0.75) +
scale_color_gradient(
low = cores_cafe["azul_claro"],
high = cores_cafe["marrom"]) +
scale_size_continuous(range = c(3, 12)) +
labs(
title = "Distância média x tarifa média por CEP de origem",
subtitle = "Dados: samples.nyctaxi.trips - Databricks Free Edition",
x = "Distância média (milhas)",
y = "Tarifa média (US$)",
size = "Total de viagens",
color = "Tarifa média",
caption = "Jennifer Lopes | Café com R") +
temalibrary(tidyverse)
orders_db <- tbl(con, I("samples.tpch.orders"))
pedidos_resumo <- orders_db |>
filter(o_orderstatus != "F") |>
group_by(o_orderstatus, o_orderpriority) |>
summarise(
total_pedidos = n(),
valor_total = round(sum(o_totalprice, na.rm = TRUE), 2),
valor_medio = round(mean(o_totalprice, na.rm = TRUE), 2),
.groups = "drop") |>
arrange(desc(valor_total)) |>
collect()
pedidos_resumo# A tibble: 10 × 5
o_orderstatus o_orderpriority total_pedidos valor_total valor_medio
<chr> <chr> <int> <dbl> <dbl>
1 O 1-URGENT 137842 20847293847 151250
2 O 2-HIGH 137921 20831847392 151098
3 O 3-MEDIUM 138214 20893741829 151164
4 O 4-NOT SPECIFIED 137492 20784938471 151167
5 O 5-LOW 137981 20853928471 151136
Volumes são o sistema de armazenamento de arquivos não estruturados dentro do Unity Catalog. Eles permitem armazenar CSVs, Parquet, modelos, imagens e qualquer tipo de arquivo dentro do Databricks com controle de acesso.
Caminho de um volume:
/Volumes/[catalog]/[schema]/[volume_name]/arquivo.csv
Para a Free Edition, o caminho padrão é:
/Volumes/[seu_workspace]/default/[volume_name]/
No workspace Databricks:
1. Ir em "Catalog" no menu lateral
2. Expandir seu workspace → "default"
3. Clicar em "Create" → "Volume"
4. Nome: "dados_r"
5. Tipo: Managed Volume
6. Confirmar
O volume estará disponível em:
/Volumes/[workspace]/default/dados_r/
Verificando no Databricks:
/Volumes/[workspace]/default/dados_r/
└── resumo_nyctaxi.csv (42 linhas, 4 colunas)
O arquivo agora está disponível no Databricks. Outros usuários com permissão de leitura no volume podem acessá-lo diretamente, sem e-mail, sem compartilhamento de arquivo, sem servidor FTP.
Rows: 20
Columns: 4
$ pickup_zip <dbl> 10162, 10069, 10044, 10282, 10004 ...
$ total_viagens <dbl> 112, 287, 198, 156, 445 ...
$ distancia_media <dbl> 3.42, 2.87, 2.14, 2.98, 1.87 ...
$ tarifa_media <dbl> 18.94, 15.42, 13.87, 13.21, 12.98 ...
# R busca dados do Databricks via DBI
dados_raw <- tbl(con, I("samples.nyctaxi.trips")) |>
collect()
# R processa localmente
dados_processados <- dados_raw |>
filter(fare_amount > 0) |>
mutate(categoria_tarifa = case_when(
fare_amount < 10 ~ "Baixa",
fare_amount < 20 ~ "Média",
TRUE ~ "Alta"))
# R envia resultado de volta ao Databricks
arquivo_temp <- tempfile(fileext = ".csv")
write_csv(dados_processados, arquivo_temp)
db_volume_write(
path = "/Volumes/[workspace]/default/dados_r/tarifas_categorias.csv",
file = arquivo_temp)sparklyr é o pacote R que permite usar Apache Spark com sintaxe dplyr. É mantido pela Posit e é o padrão recomendado para R + Spark (o SparkR foi depreciado no Spark 4.x).
O pysparklyr é o backend do sparklyr para Databricks Connect v2: usa Python por baixo via reticulate para estabelecer a conexão com o Spark.
spark_connection
Method: databricks_connect
App name: sparklyr
State: open
Version: 3.5.0 (Spark 3.5.0)
Serverless: TRUE
[1] "tbl_spark" "tbl_sql" "tbl_lazy" "tbl"
[1] 21932
resultado_spark <- trips_spark |>
filter(fare_amount > 0, trip_distance > 0) |>
group_by(pickup_zip) |>
summarise(
total = n(),
distancia_med = mean(trip_distance, na.rm = TRUE),
tarifa_med = mean(fare_amount, na.rm = TRUE),
.groups = "drop") |>
filter(total >= 50) |>
arrange(desc(tarifa_med)) |>
collect()
resultado_spark |> slice_head(n = 8)# A tibble: 8 × 4
pickup_zip total distancia_med tarifa_med
<int> <dbl> <dbl> <dbl>
1 10162 112 3.42 18.94
2 10069 287 2.87 15.42
3 10044 198 2.14 13.87
4 10282 156 2.98 13.21
5 10004 445 1.87 12.98
6 10282 203 2.54 12.74
7 10005 318 2.31 12.43
8 10280 178 2.19 11.98
# FUNCIONA com serverless:
trips_spark |>
filter(fare_amount > 5) |>
group_by(pickup_zip) |>
summarise(n = n()) |>
collect()
# NÃO FUNCIONA com serverless:
# spark_apply() - o ambiente serverless não tem R instalado
trips_spark |>
spark_apply(function(df) {
df |> mutate(flag = fare_amount > 10)
})
# Error: spark_apply() is not supported in serverless environmentImportant
spark_apply() não funciona na Free Edition porque o compute serverless não tem R instalado. Para funções R arbitrárias sobre dados Spark, é necessário um cluster dedicado com R instalado, disponível nos planos pagos.
library(brickster)
library(DBI)
library(dbplyr)
library(tidyverse)
# 1. Conectar ao Databricks
con <- dbConnect(
drv = DatabricksSQL(),
warehouse_id = Sys.getenv("DATABRICKS_WAREHOUSE_ID"),
catalog = "samples")
# 2. Consultar dados do Databricks
dados <- tbl(con, I("samples.tpch.orders")) |>
filter(o_orderstatus == "O") |>
group_by(o_orderpriority) |>
summarise(
total_pedidos = n(),
valor_medio = round(mean(o_totalprice, na.rm = TRUE), 2),
.groups = "drop") |>
arrange(desc(valor_medio)) |>
collect()
# 3. Visualizar com ggplot2
dados |>
ggplot(aes(
x = reorder(o_orderpriority, valor_medio),
y = valor_medio,
fill = o_orderpriority)) +
geom_col(width = 0.65, alpha = 0.9) +
coord_flip() +
scale_fill_manual(
values = colorRampPalette(
c("#E5D3B3", "#224573"))(5)) +
scale_y_continuous(
labels = scales::dollar_format(prefix = "US$ ")) +
labs(
title = "Valor médio de pedidos abertos por prioridade",
subtitle = "Dados: samples.tpch.orders - Databricks Free Edition",
x = NULL,
y = "Valor médio do pedido",
caption = "Jennifer Lopes | Café com R") +
tema +
theme(legend.position = "none")
# 4. Encerrar conexão
dbDisconnect(con)R como consumidor (mais comum):
Databricks transforma dados em escala
|
| DBI + dbplyr
v
R coleta apenas o resultado final
|
| ggplot2, tidymodels, gtsummary
v
Análise, modelo, relatório
R como produtor:
R processa dados localmente (amostra, experimento)
|
| db_volume_write()
v
Databricks armazena e compartilha
|
| Notebooks, dashboards, outros usuários
v
Consumo pelo time
O Databricks é uma plataforma de escala. Ele não substitui o que o R faz bem:
dplyr, ggplot2 e skimrtidymodels e lme4plotly e leafletgtsummary e gtO R e o Databricks são complementares, não concorrentes.
O R não escala para o que o Databricks faz:
Analytics Engineer que domina R + Databricks:
brickster e dbplyrEsse perfil é raro e bem remunerado no mercado brasileiro de dados.
| Situação | Causa | Solução |
|---|---|---|
Error: Cannot find warehouse |
warehouse_id incorreto |
Verificar com db_sql_warehouse_list() |
| Autenticação falha | Token expirado ou incorreto | Gerar novo token no workspace |
spark_apply() falha |
Serverless não tem R | Aceitar limitação ou usar plano pago |
| Timeout na conexão | Warehouse inativo | Aguardar o warehouse inicializar (~30s) |
| Volume não encontrado | Caminho incorreto | Verificar a estrutura no Unity Catalog |
brickster: databrickslabs.github.io/bricksterContinue praticando e explorando.
Esta aula é parte do projeto Café com R. É open source. Use, compartilhe e adapte.
Que cada gole desperte uma nova ideia.
Que cada script abra uma nova conversa.
Que o Café com R se torne um ponto de encontro nosso.
SITE OFICIAL > https://jenniferlopes.github.io/meu_site/

Jennifer Lopes | Café com R