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.
Dans quels cas DuckDB est-il préférable à pandas ou Spark ?
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
""")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()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()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')
""")Comment utilisez-vous DuckDB dans un pipeline de production ?
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | SQL DuckDB basique, read_parquet, intégration pandas | Remplace pandas par DuckDB pour les agrégations, utilise read_parquet | N a jamais utilisé DuckDB |
| Senior | PIVOT/UNPIVOT natif, ASOF JOIN, S3, optimisation | Utilise DuckDB en production, configure la mémoire et les threads | Ne sait pas que DuckDB peut lire directement depuis S3 |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.