Volver al inicio

WebAssembly SQL para Excel y Parquet en el navegador

El artículo describe un motor SQL en C++ en WebAssembly para analizar Excel, CSV, Parquet en el navegador. Workbook monta archivos como tablas virtuales con soporte para JOIN. Se proporcionan ejemplos de API, metadatos y casos de uso para análisis offline.

SQL en C++ en el navegador: análisis de Parquet y Excel en WebAssembly
Advertisement 728x90

# Análisis SQL de Excel, CSV y Parquet en el navegador con C++ y WebAssembly

WebAssembly permite ejecutar código C++17 para analizar datos tabulares directamente en el navegador. La solución basada en excel_loader virtualiza los archivos como tablas SQL: XLSX, Parquet y CSV se montan sin cargarlos completamente en memoria. Esto elimina el bloqueo de la UI y las fugas de memoria comunes en las bibliotecas JS, manteniendo los datos del usuario privados en su dispositivo.

La arquitectura combina un núcleo en C++ con interoperabilidad Emscripten y un envoltorio JS. El motor detecta el formato desde la firma del blob y soporta JOIN entre archivos heterogéneos en un solo Workbook.

Arquitectura: Desde el análisis hasta las consultas SQL

El núcleo en C++ de excel_loader maneja el análisis con bibliotecas nativas, construye tablas virtuales y planifica consultas. Emscripten exporta las clases ExcelLoaderEngine, Workbook y QueryResult a JS. La capa cliente pasa un ArrayBuffer del input y recibe resultados JSON.

Google AdInline article slot

Workbook es la abstracción central: un contenedor para múltiples archivos tratados como una sola base de datos. Formatos soportados:

  • Excel/Office: XLSX, XLSB, XLS, ODS
  • Archivos planos: CSV, TSV, TXT
  • Columnar/BigData: Parquet, DuckDB, ORC, AVRO
  • Bases de datos legadas: SQLite, DBF, MDB, ACCDB
  • NoSQL/Documentos: JSON, JSONL, XML, HTML

La detección automática de formato simplifica la integración: el frontend pasa un Uint8Array sin ningún preprocesamiento.

Implementación práctica de la API

Inicializar el módulo WASM y cargar un archivo requiere código mínimo. El motor detecta el tipo automáticamente.

Google AdInline article slot
// Initialization WASM-modulya
const module = await ExcelLoaderModule();
const engine = new module.ExcelLoaderEngine();

// Poluchaem file from standartnogo input
const fileInput = document.getElementById("fileUploader");
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();

// Otkryvaem file how Workbook
const workbook = engine.openSingleFile(
    file.name, 
    new Uint8Array(arrayBuffer)
);

window.currentWorkbook = workbook;

Ejecutar una consulta SQL en el archivo montado:

const sql = "SELECT * FROM 'Sheet1' WHERE Amount > 1000 ORDER BY Date DESC LIMIT 10";

try {
    const result = window.currentWorkbook.executeQuery(sql);
    const data = result.toJSON(); 
    console.table(data);
} catch (e) {
    console.error("SQL Error:", e);
}

Para proyectos multiarchivo, usa un manifiesto JSON:

// manifest.json
{
  "files": [
    { "name": "data_2023.parquet", "alias": "History" },
    { "name": "new_orders.csv", "alias": "Current" }
  ]
}
const workbook = openProjectFromManifest(engine, manifestJson, fileBuffers);
// Dostupno: SELECT * FROM History JOIN Current ...

Metadatos y rendimiento

El método getStats() devuelve estructuras de datos sin ejecutar consultas:

Google AdInline article slot
{
    "name": "sheet1$",
    "displayName": "Otchet_Prodazhi",
    "fileName": "report_final.xlsx",
    "type": "excel-sheet",
    "rows": 15400,
    "columns": 24,
    "memoryUsage": "..."
}

Las operaciones en memoria en C++ minimizan la sobrecarga en comparación con V8. Parquet se lee de forma eficiente gracias a las estructuras columnares y la vectorización.

Ventajas clave de rendimiento:

  • Sin bloqueo de la UI al analizar archivos de más de 50 MB
  • JOIN entre XLSX y CSV sin servidor
  • Uso mínimo de memoria frente a alternativas JS (SheetJS, AlaSQL)
  • Acceso offline a metadatos para la UI

Aplicaciones en el desarrollo

Esta solución es ideal para desarrolladores frontend y fullstack de nivel medio/senior.

  • Dashboards local-first: Análisis completamente offline sin enviar datos a ningún lado
  • Validación en el lado del cliente: Reglas SQL para verificar archivos antes de subirlos
  • Convertidores: Parquet → filtro SQL → JSON/CSV directamente en el navegador
  • Extensiones de editores de Office: Consultas SQL en celdas en versiones web

Puntos clave

  • Las tablas virtuales montan archivos sin cargarlos completamente en RAM
  • Detección automática de más de 15 formatos desde firmas de blob
  • Workbook admite JOIN entre fuentes heterogéneas como una sola base de datos
  • C++ mediante WASM supera a JS en conjuntos de datos grandes
  • Privacidad total: los datos nunca salen del navegador

— Editorial Team

Advertisement 728x90

Leer después