>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
Rust

Delta Lake sans JVM ni PySpark dans des projets Rust et Python

Quiconque a essayé d'adopter le format Delta Lake dans de petits services ou des scripts se heurte rapidement à une réalité brutale. Pour simplement lire quelques gigaoctets de fichiers journaux de transactions, vous devez traîner Apache Spark, et avec lui l'infrastructure JVM lourde. Dans les grandes plateformes de données, cela se justifie, mais pour une application locale, un microservice en arrière-plan ou une fonction serverless AWS Lambda, une telle solution semble bien trop fastidieuse.

Des développeurs de la communauté Delta Lake ont décidé de combler cette lacune. Ils ont créé le projet delta-rs — une bibliothèque native pour travailler avec Delta Lake en Rust, avec des liaisons officielles pour Python.

logo delta-rs

Pourquoi une autre bibliothèque de données

Le format Delta Lake est excellent car il résout les principaux points douloureux du stockage de fichiers ouvert. Il ajoute un journal de transactions ACID au-dessus des fichiers Parquet, un historique des modifications avec la possibilité de revenir aux versions précédentes (voyage dans le temps), et une application stricte du schéma.

La pile classique autour de Delta Lake a historiquement été liée à Scala et Java. Si votre pile principale est Rust ou un Python léger sans frameworks lourds comme PySpark, avant l'arrivée de delta-rs, vos options étaient limitées.

La bibliothèque fournit des API de bas niveau pour Rust et une interface de haut niveau pour Python. Vous pouvez désormais écrire des données avec des garanties ACID dans un bucket S3 ou sur le disque local en quelques lignes de code sans démarrer de processus JVM.

Démarrage rapide en Python et Rust

L'interface du package Python deltalake est conçue pour que les développeurs n'aient pas à tout réapprendre. Elle s'intègre facilement avec les bibliothèques d'analyse familières — Pandas, Arrow ou Polars.

Écrire et lire une table en Python ressemble beaucoup à ce qu'on connaît déjà :

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 détail intéressant : vous pouvez instantanément ouvrir la même table depuis une application Rust. Aucun assemblage manuel de métadonnées n'est nécessaire. La bibliothèque analysera automatiquement le journal de validation JSON dans le répertoire _delta_log.

Exemple de lecture des métadonnées d'une table 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(())
}

Sous le capot et intégrations

La haute vitesse et la faible consommation de mémoire ne sont pas accidentelles. Le projet est construit sur le moteur Apache Arrow et le moteur vectoriel DataFusion. Rust est utilisé pour la gestion sécurisée de la mémoire et les E/S parallèles lors du travail avec le stockage cloud.

La bibliothèque peut fonctionner directement avec AWS S3, Google Cloud Storage, Azure Blob Storage et le système de fichiers local.

Grâce à la base partagée sur Rust et Arrow, delta-rs est rapidement devenu partie intégrante de l'écosystème moderne de traitement de données. Les outils populaires fonctionnent avec out of the box :

  • Polars utilise delta-rs pour la lecture et l'écriture directes des tables Delta.
  • DuckDB peut exécuter des requêtes SQL analytiques sur les journaux Delta.
  • Da, Dask et Ray utilisent ce module pour le traitement distribué des données en Python.
  • AWS SDK for Pandas l'utilise comme moteur natif pour le format Delta.

Cas d'utilisation pratiques

Dans quelles situations delta-rs l'emporte-t-il sur l'approche classique ?

Le premier cas est l'architecture en microservices. Par exemple, vous avez un service Rust ou Python qui collecte des événements d'une file de messages et doit ajouter des lots à un magasin de données toutes les cinq minutes. Démarrer un cluster Spark pour cela est coûteux et complexe à maintenir. Avec delta-rs, le service lie simplement la bibliothèque et écrit les données directement dans S3.

Le deuxième cas est les pipelines ETL légers. Si vos volumes de données se mesurent en dizaines ou centaines de gigaoctets, Polars combiné à delta-rs les traitera sur une seule instance plus rapidement qu'un cluster PySpark ne peut être provisionné.

Le troisième cas est l'architecture Serverless. Dans les fonctions AWS Lambda avec des limites strictes sur la taille de l'image et le temps de démarrage, faire tenir un environnement Java est problématique. Un binaire Rust compilé avec delta-rs démarre en millisecondes.

Le projet a-t-il des limitations ? Oui, la spécification Delta Lake est assez étendue et est constamment mise à jour par Databricks. Certaines fonctionnalités rares ou nouvelles du format sont implémentées dans delta-rs avec un léger retard. Avant d'utiliser des opérations complexes comme MERGE avec des conditions spécifiques, vous devriez vérifier le tableau des fonctionnalités prises en charge dans la documentation du projet.

Conclusion

L'équipe delta-io a fait un excellent travail. La bibliothèque native Rust a ramené la légèreté dans le travail avec le format Delta Lake.

Si vous avez besoin de transactionalité, de versioning des données et de stockage fiable au-dessus de Parquet, mais que vous ne voulez pas dealt with Java infrastructure, donnez définitivement une chance à delta-rs. Vous pouvez installer le package en Python avec la commande pip install deltalake, et l'ajouter à un projet Rust via cargo add deltalake.

Projets similaires