Accueil À propos Tech Stack Projets Blog Tracker
Retour au Blog

Dataflow Gen2 vs Fabric Notebook :
Le framework de décision que personne n'a écrit

Tout le monde demande « Dataflow Gen2 ou Notebook ? » et obtient des réponses vagues. Voici un arbre de décision concret, de vrais chiffres CU, et 4 scénarios détaillés pour faire le bon choix à chaque fois.

Table des matières
  1. Les 5 dimensions qui comptent vraiment
  2. L'arbre de décision
  3. La réalité des coûts CU
  4. 4 scénarios concrets
  5. Quand utiliser les deux ensemble
  6. Carte de référence rapide

C'est l'une des questions les plus fréquentes que je vois sur les forums de la communauté Fabric :

« Est-ce que je dois construire cette transformation dans un Dataflow Gen2 ou dans un Fabric Notebook ? »

La documentation officielle dit : « Utilisez les Dataflows pour les transformations low-code, utilisez les Notebooks pour la logique complexe. » Ce n'est pas un framework de décision. C'est un slogan.

En pratique, le mauvais choix vous coûte des CUs, du temps de debug et de la maintenabilité. Voici un framework qui répond vraiment à la question, construit à partir de l'expérience sur de vrais workloads.

01.Les 5 dimensions qui comptent vraiment

Avant l'arbre de décision : voici les facteurs qui changent réellement la réponse.

DimensionPourquoi ça change tout
Volume de lignesDataflow utilise le moteur Mashup (mono-noeud) ; le Notebook utilise Spark (distribué)
Complexité des transformationsM / Power Query vs PySpark/SQL, plafond très différent
OrchestrationLes deux s'intègrent aux pipelines, mais différemment
Coût CUDataflow facture par query à 12 CU/s ; Spark facture par session (4–8 CU/s selon le pool)
Compétences de l'équipePower Query est accessible aux analystes ; PySpark demande du niveau ingénieur
RéutilisabilitéLes Notebooks s'importent comme modules ; les Dataflows non

02.L'arbre de décision

DATAFLOW GEN2

Chargement vers Lakehouse avec transformations légères ET moins de 5M de lignes
Filtres, renommages, cast uniquement. Le moteur Mashup gère ça de manière efficace.

NOTEBOOK

Chargement vers Lakehouse ET plus de 5M de lignes OU jointures sur grandes tables
Spark passe à l'échelle horizontalement. Le moteur Mashup, non.

NOTEBOOK

Logique métier complexe : pivots, agrégations personnalisées, features ML, fonctions fenêtre.

DATAFLOW GEN2

L'audience est des analystes / équipe BI (pas de Python)
Power Query est leur langage. N'imposez pas PySpark.

NOTEBOOK

Besoin de tests unitaires, logique versionnée, fonctions réutilisables
Les Notebooks supportent pytest, les fichiers .py gérés par Git, les modules importables.

DATAFLOW GEN2

Chargement de la même source vers 10+ tables de sortie
Utilisez le query referencing : 1 évaluation source × N tables de sortie = bien moins cher : Dataflow lit la source une seule fois, un job Spark la lirait N fois.

DATAFLOW GEN2

Rafraîchissement incrémental / pattern watermark ET moins d'1M de lignes/jour
Le watermark avec List.Max est rapide et économique pour les petites charges quotidiennes.

NOTEBOOK

Rafraîchissement incrémental avec merge complexe / upsert / SCD2
MERGE INTO en Spark SQL gère la gestion de l'historique. Power Query ne peut pas.

03.La réalité des coûts CU

C'est là que la décision devient contre-intuitive. Voici les chiffres réels.

Facturation Dataflow Gen2

Dataflow Gen2 facture par query de sortie, à :

  • 12 CU/seconde pour les 10 premières minutes de chaque query
  • 1,5 CU/seconde au-delà de 10 minutes (8× moins cher)

Plus en option : High Scale Compute (Staging) : 6 CU/s fixe quand activé | Fast Copy : 1,5 CU/s quand applicable.

EXEMPLE : 10 TABLES DE SORTIE, CHACUNE TOURNE 3 MINUTES 10 tables × 3 min × 60s × 12 CU/s = 21 600 CU consommés

MÊMES 10 TABLES AVEC QUERY REFERENCING 1 query source (partagée) + 10 petites queries de filtre ≈ ~80% de réduction

Facturation Spark (Notebook / Spark Job Definition)

Les jobs Spark (exécutés via Notebook ou Spark Job Definition) facturent par session Spark (pas par query) :

  • Starter pool : démarre à 4 CU/s (8 vCores), monte à 8 CU/s minimum après scale-up automatique ; Custom Pool Small : 2 CU/s
  • La session est partagée entre toutes les cellules
EXEMPLE : 10 CHARGEMENTS DE TABLES DANS UN NOTEBOOK 1 session × 10 min × 60s × 4 CU/s = 2 400 CU consommés

Comparaison directe

ScénarioDataflow Gen2Spark (Notebook)
5 petites tables, 30s chacune~900 CU~1 200 CU
20 tables depuis la même source~14 400 CU (sans ref)
→ ~3 000 CU (avec ref)
~4 800 CU
1 table, 50M lignes, jointure lourdeTrès lent / OOM~6 000 CU (Spark s'adapte)
Rafraîchissement incrémental, 100k lignes/jour~720 CU~2 400 CU
💡 Règle empirique

Pour de nombreuses petites tables depuis la même source, Dataflow Gen2 avec query referencing gagne. Pour les grands volumes ou la logique complexe, le Notebook gagne.

04.4 scénarios concrets

Scénario A : Charger un fichier Excel SharePoint dans 15 tables Lakehouse

UTILISEZ DATAFLOW GEN2

Créez une query de base qui lit le fichier Excel. Référencez-la 15 fois avec des queries Reference, une par onglet/table de sortie. SharePoint est lu une seule fois ; les 15 tables sont dérivées en mémoire.

Si vous utilisez un Notebook ici, vous ouvrez le fichier Excel 15 fois (15 appels HTTP vers SharePoint), vous le parsez 15 fois, et vous payez 15 lectures Spark séparées d'un format non-natif.

Scénario B : Construire une table de faits Gold avec SCD Type 2

UTILISEZ UN NOTEBOOK

Ce n'est pas exprimable en Power Query. N'essayez pas.

PYSPARKnb_silver_dim_customer.py
spark.sql("""
  MERGE INTO gold.dim_customer AS target
  USING (SELECT * FROM silver.stg_customer) AS source
  ON target.customer_id = source.customer_id AND target.is_current = true
  WHEN MATCHED AND (target.email != source.email OR target.city != source.city) THEN
    UPDATE SET target.is_current = false, target.end_date = current_date()
  WHEN NOT MATCHED THEN
    INSERT (customer_id, email, city, start_date, end_date, is_current)
    VALUES (source.customer_id, source.email, source.city, current_date(), null, true)
""")

Scénario C : Chargement incrémental quotidien, 200k lignes depuis SQL Server

UTILISEZ DATAFLOW GEN2 + WATERMARK

Un job Spark coûterait 10–15× plus cher par exécution pour la même logique : la session Spark (4–8 CU/s) tourne pendant toute sa durée, même pour une petite charge incrémentale.

POWER QUERY Mdf_load_fact_sales.pq
// Query helper watermark
LastLoadDate = List.Max(
  Table.Column(Lakehouse.Contents(...){[Name="fact_sales"]}[Data], "load_date"),
  #date(2020, 1, 1)
)

// Query principale : filtrer la source avant chargement
FilteredRows = Table.SelectRows(Source, each [created_at] > LastLoadDate)

Scénario D : Table de faits de 200M lignes, fonctions fenêtre complexes

UTILISEZ UN NOTEBOOK

Le moteur Mashup de Dataflow Gen2 tourne sur un seul noeud. À 200M lignes avec des fonctions fenêtre, vous atteindrez les limites mémoire ou des temps d'exécution extrêmes. Spark distribue le travail, c'est précisément pour ça qu'il est fait.

PYSPARKnb_gold_order_metrics.py
from pyspark.sql.window import Window
from pyspark.sql.functions import lag, col

w = Window.partitionBy("customer_id").orderBy("order_date")

df = df.withColumn("prev_order_date", lag("order_date", 1).over(w)) \
       .withColumn("days_since_last_order",
                   (col("order_date").cast("long") - col("prev_order_date").cast("long")) / 86400)

05.Quand utiliser les deux ensemble

Le pattern le plus puissant est un pipeline qui combine les deux outils :

ARCHITECTUREpipeline_médaillon
[Dataflow Gen2]                    [Notebook]
Charger les données brutes    →    Appliquer la logique métier
(Excel, SharePoint, APIs)          (SCD2, agrégations, features ML)
Écrire en Bronze/Silver        →    Écrire en Gold Lakehouse

Dataflow gère l'extraction et la normalisation légère (son point fort). Le Notebook gère la logique de transformation (son point fort). Aucun outil n'est forcé à faire ce pour quoi il est mauvais.

06.Carte de référence rapide

Si vous avez besoin de...Utilisez
Low-code, accessible aux analystesDataflow Gen2
Plusieurs tables depuis la même sourceDataflow Gen2 + query referencing
Plus de 10M lignes avec transformations lourdesNotebook
SCD2 / MERGE INTO / upsertsNotebook
Tests unitaires pour votre logiqueNotebook
Rafraîchissement incrémental < 1M lignes/jourDataflow Gen2
Fonctions fenêtre complexesNotebook
Fonctions Python réutilisables en bibliothèqueNotebook
L'équipe non-technique maintient le codeDataflow Gen2

📚 Références