DuckDB, né d’un projet universitaire, s’est rapidement imposé comme un acteur clé dans l’univers des plateformes de Data ces dernières années. Son principal atout ? La facilité avec laquelle il permet de manipuler, via SQL, des données qui ne sont pas dans un système de gestion de base de données (SGBD)
Qualifié de “in process SQL OLAP database system”, DuckDB combine de nombreuses fonctionnalités d’un serveur de base de données, tout en se distinguant par sa singularité. Si ça ressemble fortement à une base de données transactionnelle, ça n’en est pas une, il n’y a pas de service capable de répondre à des requêtes interactives. DuckDB vous offre la flexibilité de lancer rapidement un processus de transformation et de modélisation de données SQL ’en temps réel’, pour ensuite s’en défaire une fois le traitement achevé. Il intègre aisément un moteur SQL in-memory à vos processus Python de transformation de données.
DuckDB se distingue également par son format de fichier propre, mais son véritable atout réside dans la possibilité de se connecter directement à un DataLake, exploitant ainsi des stockages de type S3. Parmi les nombreux formats de fichiers pris en charge, l’utilisation du format parquet est particulièrement recommandée pour optimiser les performances. De plus, DuckDB assure une compatibilité directe avec les structures de données natives de Python, comme les DataFrames. Le cout de stockage de données dans un stockage de type S3 est le plus économique du marché, mais offre de part la structure de fichiers parquet un niveau de performance très satisfaisant. Cette combinaison offre un un rapport performance/cout imbattable.
Comment utiliser DuckDB dans votre code Python
Instancier DuckDB dans votre code Python ne requiet que quelques lignes :
import duckdb
duckdb.install_extension("httpfs")
duckdb.load_extension("httpfs")
duckdb.sql(f"SET s3_region='{S3_REGION}';")
duckdb.sql(f"SET s3_access_key_id='{ACCESS_KEY_ID}';")
duckdb.sql(f"SET s3_secret_access_key='{SECRET_ACCESS_KEY}';")
duckdb.sql(f"SET s3_endpoint='{S3_ENDPOINT}';")
query = """
SELECT s.opentime, s.high
FROM 's3://monbucket/path/to/fichier.parquet' s
"""
# query result as a pandas dataframe
res = duckdb.sql(query).df()
Dans un scnenario assez classique on va vouloir executer la requete sur de multiples fichiers :
query = f"""
SELECT COUNT(*)
FROM read_parquet("s3://bucket/fic1.pq",
"s3://bucket/fic2.pq",
"s3://bucket/fic3.pq") s
"""
res = duckdb.sql(query).df()
A l’issue des transformations, on peut aussi très facilement matérialiser le résultat des traitements vers un nouveau fichier parquet :
duckdb.sql(f"COPY ({query}) TO 's3://monbucket/result.parquet' (FORMAT PARQUET);")
Utiliser DuckDB avec DataTask
L’intégration de DuckDB avec DataTask ouvre des perspectives fascinantes pour la transformation de grandes quantités de données stockées dans un DataLake, en utilisant des scripts Python/SQL. DataTask simplifie le processus en instanciant les ressources nécessaires et en intégrant automatiquement les variables d’environnement dans le processus. Cette approche vous permet de vous concentrer pleinement sur vos opérations de données, tandis que DataTask s’occupe de toute la gestion en arrière-plan.
Pour aller plus loin
Nous avons exploré comment l’utilisation de DuckDB avec DataTask simplifie remarquablement les transformations SQL dans un environnement DataLake. Plutôt que de naviguer dans la complexité des traitements PySpark/SQL, DuckDB vous permet de vous concentrer directement sur l’essentiel : le SQL pur. Dans un article à venir, nous examinerons l’association de DuckDB avec DBT pour modéliser de manière sémantique votre Datawarehouse sur le Datalake, alliant ainsi le meilleur des deux mondes.