PT EN
Voltar ao site

DATTABI — Análise Estatística com R/CRAN

Previsão de séries, modelos estatísticos, testes de hipótese: há análises que só o ecossistema R resolve bem — e que antes exigiam exportar os dados para fora da plataforma. No DATTABI você aplica qualquer função, procedure ou pacote do CRAN diretamente sobre os datasets conectados, sem que o DATTA precise reescrever ou encapsular cada função em DATTAX: o R é um motor de análise nativo, você escreve R idiomático e o resultado é materializado como qualquer outro dataset da plataforma.

Status de implementação: o motor de execução R já existe; partes da interface descritas aqui (a aba "Análise R" e o painel de pacotes) ainda são roadmap. Este guia descreve a arquitetura-alvo.

Como a execução acontece

A plataforma mantém um conjunto de processos GNU R com Rserve (o binário que serve sessões R por socket TCP) e conversa com eles pelo cliente Java (REngine/RserveCli). O ambiente R gerenciado cuida de:

  • Isolamento por worker: um processo R por worker — uma falha em R nunca derruba os demais nem a plataforma.
  • Paralelismo: cada execução dispara N sessões R em paralelo (uma por fatia do dataset) usando concorrência estruturada do Java 25. Datasets grandes são particionados pela coluna que você definir (hash, faixa ou auto-shard).
  • Bibliotecas paralelas de R já instaladas: parallel, foreach, doParallel, future, data.table, Rcpp.
  • Transferência de dados: data frames Java ↔ R por mapeamento direto, sem serialização JSON; datasets grandes trafegam em blocos (streaming).
  • On-premises: imagens datta/r-runtime:<versão>, baseadas em r-base + Rserve, rodam dentro da sua instalação — nada sai para a nuvem.

R puro, sem tradução intermediária

Você escreve R de verdade, importando qualquer pacote CRAN habilitado:

r
library(forecast)
# 'dataset' é injetado pelo DATTABI como data.frame
modelo <- auto.arima(dataset$valor)
previsao <- forecast(modelo, h = 12)
result <- data.frame(
  mes = seq.Date(from = max(dataset$data) + 30, by = "month", length.out = 12),
  previsto = as.numeric(previsao$mean)
)
result

Não há tradução DATTAX intermediária: o bloco LANG R { ... } é reconhecido e repassado textualmente ao motor R, anotado com os datasets de entrada e o tipo de saída esperado. Isso libera o ecossistema completo do CRAN (tidyverse, caret, xgboost, forecast, prophet, survival, igraph, sf, rstan, tm e os demais pacotes habilitados).

A aba Análise R (interface — roadmap parcial)

No editor de dataset/dashboard, a aba "Análise R" reúne:

  • Editor de código R (Monaco, modo R) com auto-complete de dataset$<coluna>.
  • Painel dos pacotes CRAN instalados, com a ação Solicitar pacote (sujeita a aprovação do administrador).
  • Seletor multi-fonte dos datasets de entrada.
  • Tipo de saída: data.frame → dataset materializado; gráfico ggplot2 em SVG (renderizado sem interface gráfica); modelo .rds; valor escalar → métrica.
  • Executar (preview) — roda sobre uma amostra de 1.000 linhas e mostra o resultado na hora.
  • Materializar — enfileira a execução no agendador de atualizações.
  • Copilot R — a IA gera o script a partir de uma descrição em português, usando o schema do dataset e os pacotes disponíveis.

R como etapa de um pipeline DATTAX

Dentro de um pipeline DATTAX, o bloco LANG R { ... } insere uma etapa R entre transformações — e o resultado segue para a materialização como qualquer dataset:

dattax
DATASET vendas_mensal =
  FROM JDBC "Oracle_Vendas"
  |> GROUP BY ano, mes
  |> AGG total = SUM(valor)
  |> LANG R {
       library(forecast)
       result <- data.frame(mes = dataset$mes, total = dataset$total,
                             tendencia = ma(dataset$total, order = 3))
       result
     }
  |> MATERIALIZE AS ICEBERG TABLE "vendas_com_tendencia";

O bloco é uma transformação opaca para o interpretador: não é validado pela gramática DATTAX, apenas repassado ao motor R. Para bases grandes, a execução pode ser particionada com LANG R PARTITION BY {coluna} CONCURRENCY {N} { ... }, que divide o dataset em N fatias processadas em paralelo, com um bloco REDUCE { ... } opcional para consolidar (sem ele, os resultados são empilhados com rbind).

Materialização dos resultados

O data.frame retornado é tratado como qualquer dataset DATTAX: a plataforma escolhe o destino — Iceberg (padrão tabular), Neo4j (colunas from_id / to_id viram nós e arestas) ou OpenSearch (texto/full-text). Para sobrescrever a escolha, use a forma explícita MATERIALIZE AS NEO4J DATABASE "..." LABEL "..." KEY "...".

Pacotes CRAN sob controle

  • Catálogo: o administrador gerencia os pacotes habilitados no console do ambiente R (/configurar/r-runtime).
  • Instalação: por espelho CRAN local (miniCRAN) dentro da instalação — funciona 100% offline. O administrador aprova, a instalação roda em todos os workers e o catálogo é atualizado.
  • Versionamento: cada pacote tem versão fixada (resultados reproduzíveis); upgrades exigem aprovação.
  • Bloqueio: o time de segurança mantém uma lista negra de pacotes inseguros (execução arbitrária, rede irrestrita, compilação inline).

Segurança, permissões e auditoria

  • Ambiente isolado por worker: perfil restritivo de chamadas de sistema, sem saída de rede (exceto o espelho CRAN interno e o cache da plataforma), sistema de arquivos somente leitura fora da área temporária — limpa a cada execução — e limites de CPU e memória. system(), download.file() externo e library() de pacotes não aprovados são bloqueados.
  • Permissões (Diretrizes do Projeto §13): DATTABI_R_EXECUTE (executar), DATTABI_R_PACKAGE_REQUEST (solicitar pacote) e R_RUNTIME_ADMIN (aprovar instalações e bloqueios).
  • Auditoria: cada execução emite DATTABI.R.EXECUTED com actor, datasetIds, packagesUsed, rowsIn/Out, durationMs, peakMemoryMb e outcome, mascarando strings que casem com padrão de credencial.

Cache, observabilidade e operação

  • Cache (Diretrizes do Projeto §1): resultados de execuções determinísticas (mesmo script, mesmos datasets) ficam no cache de duas camadas da plataforma sob datta:dattabi:r:result:{hash} com TTL — repetir a análise responde na hora, sem executar de novo.
  • Observabilidade (Diretrizes do Projeto §11): cada execução gera o span r.execute com r.script_hash, r.packages, r.rows_in/out, r.partitions e r.runtime_version; os logs do R chegam ao OpenSearch (otel-logs-*) correlacionados por trace_id.
  • Console (/configurar/r-runtime, Diretrizes do Projeto §8): workers, pacotes, fila de jobs, logs por execução e métricas de uso por usuário.