AccueilBlogTest technique DuckDB : SQL analytique in-process pour la data
Guide recrutement data

Test technique DuckDB : SQL analytique in-process pour la data

DuckDB est devenu l outil de référence pour l analyse locale sur des fichiers Parquet ou des DataFrames pandas. En entretien, on évalue la capacité à l utiliser comme moteur analytique puissant.

Data Builder·Juin 2025·6 min de lecture·Data Engineer · Data Scientist
Sommaire
  1. Pourquoi DuckDB
  2. SQL analytique avancé
  3. Requêter des fichiers Parquet
  4. Intégration pandas
  5. Optimisation et performance
  6. Cas d usage en production
  7. Grille

1Pourquoi DuckDB en 2025

Question discriminante

Dans quels cas DuckDB est-il préférable à pandas ou Spark ?

2SQL analytique avancé dans DuckDB

Question discriminante

Quelles fonctionnalités SQL avancées DuckDB supporte-t-il nativement ?

import duckdb # DuckDB supporte tout le SQL analytique moderne conn = duckdb.connect() # PIVOT natif result = conn.execute(""" PIVOT orders ON region USING SUM(amount) GROUP BY YEAR(order_date) """).df() # UNPIVOT conn.execute(""" UNPIVOT wide_table ON (q1, q2, q3, q4) INTO NAME quarter VALUE revenue """) # LIST et MAP (types natifs) conn.execute(""" SELECT customer_id, LIST(product_id ORDER BY order_date) AS purchase_history, MAP(product_id, amount) AS amounts_by_product FROM orders GROUP BY customer_id """) # ASOF JOIN : jointure sur la valeur la plus proche conn.execute(""" SELECT o.*, p.price FROM orders o ASOF JOIN prices p ON o.product_id = p.product_id AND o.order_date >= p.effective_date """)

3Requêter des fichiers Parquet directement

Question discriminante

Comment requêtez-vous des fichiers Parquet sans les charger en mémoire ?

import duckdb # Requête directe sur des fichiers Parquet (glob supporté) result = duckdb.sql(""" SELECT region, YEAR(order_date) AS year, SUM(amount) AS revenue, COUNT(*) AS nb_orders FROM read_parquet('data/orders/year=*/month=*/*.parquet') WHERE order_date >= '2024-01-01' GROUP BY region, YEAR(order_date) ORDER BY revenue DESC """).df() # Predicate pushdown : DuckDB ne lit que les colonnes et lignes nécessaires # Beaucoup plus efficace que pd.read_parquet() suivi d un filtre # Créer une table virtuelle depuis Parquet duckdb.execute(""" CREATE VIEW orders_view AS SELECT * FROM read_parquet('data/orders/**/*.parquet') """) # Lire depuis S3 (nécessite le module httpfs) duckdb.install_extension('httpfs') duckdb.load_extension('httpfs') duckdb.execute("SET s3_region='eu-west-1'") result = duckdb.sql("SELECT * FROM 's3://mon-bucket/orders/*.parquet'").df()

4Intégration pandas : zero-copy avec Arrow

Question discriminante

Comment DuckDB communique-t-il avec pandas sans copier les données ?

import duckdb import pandas as pd df_orders = pd.read_csv('orders.csv') df_customers = pd.read_csv('customers.csv') # DuckDB peut requêter directement les DataFrames pandas # Via Apache Arrow (zero-copy) result = duckdb.sql(""" SELECT c.customer_name, c.segment, SUM(o.amount) AS total_revenue, COUNT(*) AS nb_orders FROM df_orders o JOIN df_customers c ON o.customer_id = c.customer_id GROUP BY c.customer_name, c.segment ORDER BY total_revenue DESC """).df() # Convertir vers différents formats result_arrow = duckdb.sql("SELECT * FROM df_orders").arrow() # PyArrow result_polars = duckdb.sql("SELECT * FROM df_orders").pl() # Polars result_numpy = duckdb.sql("SELECT amount FROM df_orders").numpy()

5Optimisation des performances DuckDB

Question discriminante

Quels sont les paramètres de configuration importants pour optimiser DuckDB ?

import duckdb conn = duckdb.connect() # Utiliser tous les coeurs disponibles conn.execute("SET threads TO 8") # Mémoire maximale (défaut : 80% de la RAM) conn.execute("SET memory_limit = '16GB'") # Spill to disk si nécessaire (pour les très gros datasets) conn.execute("SET temp_directory = '/tmp/duckdb_spill'") # Compression des résultats intermédiaires conn.execute("SET intermediate_result_chunk_cardinality = 2048") # Persistance : DuckDB peut aussi fonctionner en mode fichier conn_persistent = duckdb.connect('analytics.duckdb') conn_persistent.execute(""" CREATE TABLE IF NOT EXISTS orders AS SELECT * FROM read_parquet('data/orders/*.parquet') """)

6DuckDB en production : cas d usage

Question discriminante

Comment utilisez-vous DuckDB dans un pipeline de production ?

7Grille par niveau

NiveauMaitriseSignal GONO-GO
ConfirméSQL DuckDB basique, read_parquet, intégration pandasRemplace pandas par DuckDB pour les agrégations, utilise read_parquetN a jamais utilisé DuckDB
SeniorPIVOT/UNPIVOT natif, ASOF JOIN, S3, optimisationUtilise DuckDB en production, configure la mémoire et les threadsNe sait pas que DuckDB peut lire directement depuis S3

Vous recrutez un Data Engineer ou Data Scientist ?

Premier entretien gratuit. Rapport GO/NO-GO sous 48h.