>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
Rust

Delta Lake sin JVM ni PySpark en proyectos Rust y Python

Cualquiera que haya intentado adoptar el formato Delta Lake en servicios pequeños o scripts se encuentra rápidamente con una dura realidad. Para simplemente leer un par de gigabytes de archivos de registro de transacciones, tienes que arrastrar Apache Spark, y con él la infraestructura pesada de JVM. En grandes plataformas de datos esto está justificado, pero para una aplicación local, un microservicio en segundo plano o una función sin servidor de AWS Lambda, dicha solución resulta demasiado engorrosa.

Los desarrolladores de la comunidad Delta Lake decidieron cerrar esta brecha. Crearon el proyecto delta-rs — una biblioteca nativa para trabajar con Delta Lake en Rust, con enlaces oficiales para Python.

delta-rs logo

¿Por qué otra biblioteca de datos

El formato Delta Lake es excelente porque resuelve los principales puntos débiles del almacenamiento de archivos abierto. Añade un registro de transacciones ACID sobre archivos Parquet, historial de cambios con la capacidad de revertir a versiones anteriores (viaje en el tiempo) y aplicación estricta del esquema.

La pila clásica alrededor de Delta Lake ha estado históricamente vinculada a Scala y Java. Si tu pila principal es Rust o Python ligero sin marcos pesados como PySpark, antes de que apareciera delta-rs, tus opciones eran limitadas.

La biblioteca proporciona APIs de bajo nivel para Rust y una interfaz de alto nivel para Python. Ahora puedes escribir datos con garantías ACID a un bucket de S3 o disco local en solo un par de líneas de código sin iniciar procesos JVM.

Inicio rápido en Python y Rust

La interfaz del paquete Python deltalake está diseñada para que los desarrolladores no tengan que reaprender nada. Se integra fácilmente con bibliotecas de análisis familiares — Pandas, Arrow o Polars.

Escribir y leer una tabla en Python se ve muy familiar:

import pandas as pd
from deltalake import DeltaTable, write_deltalake

# Создаем тестовый датафрейм и сохраняем его в формате Delta
df = pd.DataFrame({"id": [1, 2], "value": ["foo", "boo"]})
write_deltalake("./data/delta", df)

# Считываем данные обратно
dt = DeltaTable("./data/delta")
df_read = dt.to_pandas()

assert df.equals(df_read)

Un detalle interesante: puedes abrir instantáneamente la misma tabla desde una aplicación Rust. No se requiere ensamblaje manual de metadatos. La biblioteca analizará automáticamente el registro de confirmación JSON en el directorio _delta_log.

Ejemplo de lectura de metadatos de tabla en Rust:

use deltalake::{open_table, DeltaTableError};
use url::Url;

#[tokio::main]
async fn main() -> Result<(), DeltaTableError> {
    let delta_path = Url::from_directory_path("/abs/data/delta").unwrap();
    let table = open_table(delta_path).await?;

    let files: Vec<_> = table.get_file_uris()?.collect();
    println!("{files:?}");

    Ok(())
}

Bajo el capó e integraciones

La alta velocidad y el bajo consumo de memoria no son accidentales. El proyecto está construido sobre el motor Apache Arrow y el motor de vectores DataFusion. Rust se utiliza para la gestión segura de memoria y E/S paralela al trabajar con almacenamiento en la nube.

La biblioteca puede trabajar directamente con AWS S3, Google Cloud Storage, Azure Blob Storage y el sistema de archivos local.

Gracias a la base compartida en Rust y Arrow, delta-rs se ha convertido rápidamente en parte del ecosistema moderno de procesamiento de datos. Herramientas populares funcionan con él de forma inmediata:

  • Polars utiliza delta-rs para lectura y escritura directa de tablas Delta.
  • DuckDB puede ejecutar consultas SQL analíticas contra registros Delta.
  • Da, Dask y Ray utilizan este módulo para procesamiento distribuido de datos en Python.
  • AWS SDK for Pandas lo utiliza como motor nativo para el formato Delta.

Casos de uso prácticos

¿En qué situaciones delta-rs supera al enfoque clásico?

El primer caso es la arquitectura de microservicios. Por ejemplo, tienes un servicio en Rust o Python que recopila eventos de una cola de mensajes y necesita agregar lotes a un almacén de datos cada cinco minutos. Crear un clúster de Spark para esto es costoso y complejo de mantener. Con delta-rs, el servicio simplemente vincula la biblioteca y escribe datos directamente en S3.

El segundo caso es pipelines ETL ligeros. Si tus volúmenes de datos se miden en decenas o cientos de gigabytes, Polars combinado con delta-rs los procesará en una sola instancia más rápido de lo que se puede aprovisionar un clúster de PySpark.

El tercer caso es la arquitectura sin servidor. En funciones de AWS Lambda con límites estrictos en el tamaño de imagen y el tiempo de inicio, ajustar un entorno Java es problemático. Un binario Rust compilado con delta-rs se inicia en milisegundos.

¿El proyecto tiene limitaciones? Sí, la especificación de Delta Lake es bastante extensa y se actualiza constantemente por Databricks. Algunas características raras o nuevas del formato se implementan en delta-rs con un ligero retraso. Antes de usar operaciones complejas como MERGE con condiciones específicas, debes consultar la tabla de características admitidas en la documentación del proyecto.

Conclusión

El equipo de delta-io ha hecho un excelente trabajo. La biblioteca nativa de Rust ha devuelto la ligereza al trabajo con el formato Delta Lake.

Si necesitas atomicidad, versionado de datos y almacenamiento confiable sobre Parquet, pero no quieres tratar con infraestructura Java, definitivamente prueba delta-rs. Puedes instalar el paquete en Python con el comando pip install deltalake, y agregarlo a un proyecto Rust a través de cargo add deltalake.

Proyectos relacionados