<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Building Production-Ready SDP Pipelines with Genie Code: The Complete Guide in Community Articles</title>
    <link>https://community.databricks.com/t5/community-articles/building-production-ready-sdp-pipelines-with-genie-code-the/m-p/159195#M1281</link>
    <description>&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="nb"&gt;How Databricks’ AI agent transforms data engineering from manual craftsmanship into conversational pipeline development&lt;/EM&gt;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Data engineers have long accepted a painful truth: building production-grade ETL pipelines means wrestling with hundreds of lines of orchestration code, manually encoding execution order, handling incremental processing logic, and then praying nothing breaks at 2 AM. Spark Declarative Pipelines (SDP) already simplified this dramatically by letting you declare&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;what&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;your data should look like rather than&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;how&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to get there. Now, with Genie Code in Agent mode, you don’t even have to write those declarations yourself.&lt;/P&gt;
&lt;FIGURE class="nn no np nq nr ns nk nl paragraph-image"&gt;
&lt;DIV class="nt nu ek nv bd nw" tabindex="0" role="button"&gt;&lt;SPAN class="eo ep eq ai er es et eu ev speechify-ignore"&gt;Press enter or click to view image in full size&lt;/SPAN&gt;
&lt;DIV class="nk nl nm"&gt;&lt;PICTURE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 1400w" type="image/webp" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"&gt;&lt;/SOURCE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/1*1VzZtaCw0WyY8glVdfkstA.png 640w, https://miro.medium.com/v2/resize:fit:720/1*1VzZtaCw0WyY8glVdfkstA.png 720w, https://miro.medium.com/v2/resize:fit:750/1*1VzZtaCw0WyY8glVdfkstA.png 750w, https://miro.medium.com/v2/resize:fit:786/1*1VzZtaCw0WyY8glVdfkstA.png 786w, https://miro.medium.com/v2/resize:fit:828/1*1VzZtaCw0WyY8glVdfkstA.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*1VzZtaCw0WyY8glVdfkstA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*1VzZtaCw0WyY8glVdfkstA.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" data-testid="og"&gt;&lt;/SOURCE&gt;&lt;/PICTURE&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shwetav1407_0-1781633757203.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/27852iC312D69CBA3164EB/image-size/medium?v=v2&amp;amp;px=400" role="button" title="shwetav1407_0-1781633757203.png" alt="shwetav1407_0-1781633757203.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;In this guide, we’ll walk through building a complete medallion architecture pipeline using Genie Code and SDP — from raw ingestion through business-ready analytics — and explore the patterns that make this approach production-worthy.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="f094" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;What Is SDP, and Why Should You Care?&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Lakeflow Spark Declarative Pipelines (SDP)&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is Databricks’ framework for building batch and streaming data pipelines in SQL and Python. Unlike traditional Spark jobs where you manually define execution order, manage checkpoints, and handle retries, SDP lets you declare your transformations and handles the orchestration automatically.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key benefits that matter for real-world pipelines:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="cd24" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Automatic orchestration&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— SDP analyzes dependencies across all your source files, builds a dataflow graph, and determines the optimal execution order with maximum parallelism. It also retries failures at the most granular level possible: first the Spark task, then the flow, then the pipeline.&lt;/LI&gt;
&lt;LI id="808f" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Incremental processing built in&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Materialized views automatically process only new data and changes. No more writing&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;MERGE&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;statements by hand.&lt;/LI&gt;
&lt;LI id="f435" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Data quality as code&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Expectations let you define quality constraints inline, right next to your transformations.&lt;/LI&gt;
&lt;LI id="16f3" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Unified batch and streaming&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Toggle between batch and streaming processing modes with a single keyword change.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Here’s what that looks like compared to traditional approaches:&lt;/P&gt;
&lt;H3 id="ed67" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;The Old Way (PySpark + Manual Orchestration)&lt;/H3&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;# Hundreds of lines for a simple weekly sales pipeline&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; SparkSession&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql.functions &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; col, &lt;SPAN class="hljs-built_in"&gt;sum&lt;/SPAN&gt;, window&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; delta.tables &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; DeltaTable&lt;BR /&gt;&lt;BR /&gt;spark = SparkSession.builder.getOrCreate()&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 1: Read raw data (manually handle incremental)&lt;/SPAN&gt;&lt;BR /&gt;raw_df = spark.read.&lt;SPAN class="hljs-built_in"&gt;format&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"delta"&lt;/SPAN&gt;).load(&lt;SPAN class="hljs-string"&gt;"/data/raw_sales"&lt;/SPAN&gt;)&lt;BR /&gt;last_processed = spark.read.&lt;SPAN class="hljs-built_in"&gt;format&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"delta"&lt;/SPAN&gt;) \&lt;BR /&gt;    .load(&lt;SPAN class="hljs-string"&gt;"/checkpoints/last_ts"&lt;/SPAN&gt;).collect()[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;][&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;new_data = raw_df.&lt;SPAN class="hljs-built_in"&gt;filter&lt;/SPAN&gt;(col(&lt;SPAN class="hljs-string"&gt;"event_time"&lt;/SPAN&gt;) &amp;gt; last_processed)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 2: Clean (manually write quality checks)&lt;/SPAN&gt;&lt;BR /&gt;cleaned = new_data.&lt;SPAN class="hljs-built_in"&gt;filter&lt;/SPAN&gt;(&lt;BR /&gt;    col(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;).isNotNull() &amp;amp; &lt;BR /&gt;    (col(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;) &amp;gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 3: Aggregate (manually handle upserts)&lt;/SPAN&gt;&lt;BR /&gt;weekly = cleaned.groupBy(&lt;BR /&gt;    window(&lt;SPAN class="hljs-string"&gt;"event_time"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"1 week"&lt;/SPAN&gt;), &lt;SPAN class="hljs-string"&gt;"region"&lt;/SPAN&gt;&lt;BR /&gt;).agg(&lt;SPAN class="hljs-built_in"&gt;sum&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;).alias(&lt;SPAN class="hljs-string"&gt;"total_sales"&lt;/SPAN&gt;))&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 4: Write (manually handle merge)&lt;/SPAN&gt;&lt;BR /&gt;target = DeltaTable.forPath(spark, &lt;SPAN class="hljs-string"&gt;"/data/weekly_sales"&lt;/SPAN&gt;)&lt;BR /&gt;target.alias(&lt;SPAN class="hljs-string"&gt;"t"&lt;/SPAN&gt;).merge(&lt;BR /&gt;    weekly.alias(&lt;SPAN class="hljs-string"&gt;"s"&lt;/SPAN&gt;),&lt;BR /&gt;    &lt;SPAN class="hljs-string"&gt;"t.window = s.window AND t.region = s.region"&lt;/SPAN&gt;&lt;BR /&gt;).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 5: Update checkpoint (manually track state)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# ... plus an Airflow DAG for scheduling, retries, alerting&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H3 id="6aef" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="ah"&gt;The SDP Way (SQL)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- The entire pipeline in a few declarations&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Bronze: raw ingestion with Auto Loader&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/data/landing/sales/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;,&lt;BR /&gt;  schema &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'event_time TIMESTAMP, region STRING, &lt;BR /&gt;             product STRING, amount DOUBLE'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Silver: cleansed with quality expectations&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; silver_sales (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_amount EXPECT (amount &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; not_null_region EXPECT (region &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  event_time,&lt;BR /&gt;  region,&lt;BR /&gt;  product,&lt;BR /&gt;  amount,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;current_timestamp&lt;/SPAN&gt;() &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; processed_at&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(bronze_sales);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold: business-ready weekly aggregation&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_weekly_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  date_trunc(&lt;SPAN class="hljs-string"&gt;'week'&lt;/SPAN&gt;, event_time) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; week_start,&lt;BR /&gt;  region,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; transaction_count,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(amount) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_sales,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(amount) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_transaction&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; date_trunc(&lt;SPAN class="hljs-string"&gt;'week'&lt;/SPAN&gt;, event_time), region;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;That’s it. SDP handles incremental processing, execution order, retries, and checkpoint management. The bronze and silver tables use streaming semantics (the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;STREAM&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;keyword), while the gold materialized view uses batch semantics but still only reprocesses changed data.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="1ce0" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Enter Genie Code: Your AI Data Engineering Partner&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Now here’s where it gets interesting. Genie Code in Agent mode — available inside the Lakeflow Pipelines Editor — doesn’t just help you&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;write&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;SDP code. It can autonomously&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;plan, generate, run, validate, and fix&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;entire pipelines from a single natural language prompt.&lt;/P&gt;
&lt;H2 id="6ebd" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;How Genie Code Agent Mode Works&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;When you enable Agent mode in the Genie Code panel within the Lakeflow Pipelines Editor, the agent adapts its capabilities specifically for data engineering tasks. Unlike chat mode, Agent mode can:&lt;/P&gt;
&lt;OL class=""&gt;
&lt;LI id="809b" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Plan a multi-step solution&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and present it for your review&lt;/LI&gt;
&lt;LI id="1e1e" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Search your Unity Catalog&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for relevant tables, schemas, and lineage&lt;/LI&gt;
&lt;LI id="a111" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Generate SQL or Python SDP source files&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the pipeline editor&lt;/LI&gt;
&lt;LI id="28b7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Run pipeline updates&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and read the output datasets&lt;/LI&gt;
&lt;LI id="c7a6" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Diagnose and fix errors&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;automatically, iterating until the pipeline succeeds&lt;/LI&gt;
&lt;LI id="fb45" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Respect your Unity Catalog permissions&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— it can only access data you can access&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key design principle is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;human-in-the-loop&lt;/EM&gt;: Genie Code proposes plans and asks for approval before executing. You can Allow, Decline, or ask it to try a different approach.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="5d29" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Tutorial: Building a Medallion Pipeline with Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Let’s walk through building a real pipeline — an e-commerce analytics pipeline that ingests order data, cleans and enriches it, and produces dashboards-ready metrics.&lt;/P&gt;
&lt;H2 id="61c2" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Prerequisites&lt;/H2&gt;
&lt;UL class=""&gt;
&lt;LI id="8c94" class="md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na pc pd pe bg" data-selectable-paragraph=""&gt;A Databricks workspace with&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Partner-powered AI features&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;enabled&lt;/LI&gt;
&lt;LI id="cf6c" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;Access to the Lakeflow Pipelines Editor&lt;/LI&gt;
&lt;LI id="ff20" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;Unity Catalog configured with a target catalog and schema&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="03a6" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 1: Create Your Pipeline and Open Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Navigate to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Pipelines&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the sidebar and create a new pipeline. Give it a name like&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;ecommerce_analytics&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and set your target catalog and schema (e.g.,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;analytics.ecommerce&lt;/CODE&gt;).&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Once in the Lakeflow Pipelines Editor, open the Genie Code panel and switch to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Agent mode&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 id="92ca" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 2: Prompt Genie Code to Build the Pipeline&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Start with a descriptive prompt that tells Genie Code what you want:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Build a medallion architecture pipeline for e-commerce analytics. I have raw order data landing as JSON files in /Volumes/raw_data/orders/ with fields: order_id, customer_id, product_id, quantity, unit_price, order_timestamp, and shipping_region. Create bronze ingestion with Auto Loader, silver cleansing with quality expectations, and gold aggregations for daily revenue by region and top products.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code will create a step-by-step plan that looks something like:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;Plan:&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;1.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Search&lt;/SPAN&gt; Unity Catalog &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; existing related tables&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;2.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; bronze_orders.sql — streaming &lt;SPAN class="hljs-keyword"&gt;table&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;with&lt;/SPAN&gt; Auto Loader&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;3.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; silver_orders.sql — cleaned data &lt;SPAN class="hljs-keyword"&gt;with&lt;/SPAN&gt; expectations&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;4.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; gold_daily_revenue.sql — daily revenue &lt;SPAN class="hljs-keyword"&gt;by&lt;/SPAN&gt; region&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;5.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; gold_top_products.sql — top products materialized &lt;SPAN class="hljs-keyword"&gt;view&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;6.&lt;/SPAN&gt; Run the pipeline &lt;SPAN class="hljs-keyword"&gt;and&lt;/SPAN&gt; validate outputs&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Review the plan, ask clarifying questions if needed, then select&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Allow&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to let Genie Code proceed.&lt;/P&gt;
&lt;H2 id="214e" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 3: Watch Genie Code Generate Your Pipeline&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code creates each source file in your pipeline. Here’s what the generated code typically looks like:&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;bronze_orders.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Bronze layer: raw ingestion from JSON landing zone&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_orders&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Raw e-commerce orders ingested via Auto Loader'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt;,&lt;BR /&gt;  _metadata.file_name &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; source_file,&lt;BR /&gt;  _metadata.file_modification_time &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; file_mod_time,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;current_timestamp&lt;/SPAN&gt;() &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; ingestion_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/Volumes/raw_data/orders/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;,&lt;BR /&gt;  inferColumnTypes &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'true'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;silver_orders.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Silver layer: cleansed and validated orders&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; silver_orders (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_order_id &lt;BR /&gt;    EXPECT (order_id &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_quantity &lt;BR /&gt;    EXPECT (quantity &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;AND&lt;/SPAN&gt; quantity &lt;SPAN class="hljs-operator"&gt;&amp;lt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;10000&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_price &lt;BR /&gt;    EXPECT (unit_price &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_timestamp &lt;BR /&gt;    EXPECT (order_timestamp &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_region &lt;BR /&gt;    EXPECT (shipping_region &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION FAIL &lt;SPAN class="hljs-keyword"&gt;UPDATE&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Cleansed orders with quality expectations enforced'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  order_id,&lt;BR /&gt;  customer_id,&lt;BR /&gt;  product_id,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(quantity &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;INT&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; quantity,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(unit_price &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;DOUBLE&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; unit_price,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(quantity &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;INT&lt;/SPAN&gt;) &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(unit_price &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;DOUBLE&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; line_total,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(order_timestamp &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;TIMESTAMP&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; order_timestamp,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;UPPER&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;TRIM&lt;/SPAN&gt;(shipping_region)) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; shipping_region,&lt;BR /&gt;  ingestion_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(bronze_orders);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;gold_daily_revenue.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold layer: daily revenue metrics by region&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_daily_revenue&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Daily revenue aggregation by shipping region'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-type"&gt;DATE&lt;/SPAN&gt;(order_timestamp) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; order_date,&lt;BR /&gt;  shipping_region,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; order_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_orders,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; customer_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; unique_customers,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_revenue,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_order_value,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(quantity) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_units_sold&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;DATE&lt;/SPAN&gt;(order_timestamp), shipping_region;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;CODE class="db pk pl pm pn b"&gt;gold_top_products.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold layer: top products by revenue&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_top_products&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Product performance ranked by total revenue'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  product_id,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; order_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; times_ordered,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(quantity) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_units,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_revenue,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(unit_price) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_price&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; product_id;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H2 id="26fd" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 4: Genie Code Runs and Validates&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;After generating the files, Genie Code asks for permission to run the pipeline. Once you approve it:&lt;/P&gt;
&lt;OL class=""&gt;
&lt;LI id="79c5" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Triggers a pipeline update&lt;/LI&gt;
&lt;LI id="40e7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Monitors execution across all flows&lt;/LI&gt;
&lt;LI id="b3f7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Reads the output datasets to verify data landed correctly&lt;/LI&gt;
&lt;LI id="ae40" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Reports back with row counts, any expectation violations, and the DAG structure&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;If something fails — say a schema mismatch in the JSON files — Genie Code diagnoses the error, proposes a fix (like adjusting the schema inference or adding a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;CAST&lt;/CODE&gt;), and iterates until the pipeline succeeds.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="3e95" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Going Deeper: Python SDP with Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;While SQL is the most common approach, SDP also supports Python for more complex transformation logic. The Python API uses decorators from the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;pyspark.pipelines&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;module (imported as&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;dp&lt;/CODE&gt;).&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Here’s what a Python-based silver layer might look like when you need custom transformation logic:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; pipelines &lt;SPAN class="hljs-keyword"&gt;as&lt;/SPAN&gt; dp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql.functions &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; col, upper, trim, when, lit&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.table(&lt;SPAN class="hljs-params"&gt;&lt;BR /&gt;    name=&lt;SPAN class="hljs-string"&gt;"silver_orders_enriched"&lt;/SPAN&gt;,&lt;BR /&gt;    comment=&lt;SPAN class="hljs-string"&gt;"Orders enriched with derived customer segments"&lt;/SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.expect(&lt;SPAN class="hljs-params"&gt;&lt;SPAN class="hljs-string"&gt;"valid_order_id"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"order_id IS NOT NULL"&lt;/SPAN&gt;, on_violation=&lt;SPAN class="hljs-string"&gt;"drop"&lt;/SPAN&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.expect(&lt;SPAN class="hljs-params"&gt;&lt;SPAN class="hljs-string"&gt;"valid_amount"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"line_total &amp;gt; 0"&lt;/SPAN&gt;, on_violation=&lt;SPAN class="hljs-string"&gt;"drop"&lt;/SPAN&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;def&lt;/SPAN&gt; &lt;SPAN class="hljs-title.function"&gt;silver_orders_enriched&lt;/SPAN&gt;():&lt;BR /&gt;    &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (&lt;BR /&gt;        spark.readStream.table(&lt;SPAN class="hljs-string"&gt;"bronze_orders"&lt;/SPAN&gt;)&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;, col(&lt;SPAN class="hljs-string"&gt;"quantity"&lt;/SPAN&gt;) * col(&lt;SPAN class="hljs-string"&gt;"unit_price"&lt;/SPAN&gt;))&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"shipping_region"&lt;/SPAN&gt;, upper(trim(col(&lt;SPAN class="hljs-string"&gt;"shipping_region"&lt;/SPAN&gt;))))&lt;BR /&gt;        .withColumn(&lt;BR /&gt;            &lt;SPAN class="hljs-string"&gt;"customer_segment"&lt;/SPAN&gt;,&lt;BR /&gt;            when(col(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;) &amp;gt;= &lt;SPAN class="hljs-number"&gt;500&lt;/SPAN&gt;, lit(&lt;SPAN class="hljs-string"&gt;"premium"&lt;/SPAN&gt;))&lt;BR /&gt;            .when(col(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;) &amp;gt;= &lt;SPAN class="hljs-number"&gt;100&lt;/SPAN&gt;, lit(&lt;SPAN class="hljs-string"&gt;"standard"&lt;/SPAN&gt;))&lt;BR /&gt;            .otherwise(lit(&lt;SPAN class="hljs-string"&gt;"basic"&lt;/SPAN&gt;))&lt;BR /&gt;        )&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"order_date"&lt;/SPAN&gt;, col(&lt;SPAN class="hljs-string"&gt;"order_timestamp"&lt;/SPAN&gt;).cast(&lt;SPAN class="hljs-string"&gt;"date"&lt;/SPAN&gt;))&lt;BR /&gt;    )&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;You can ask Genie Code specifically for Python implementations:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Add a Python-based silver transformation that enriches orders with a customer loyalty tier based on historical order count from the customers table in analytics.core.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code will search your Unity Catalog for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;customers&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;table, understand its schema, and generate a Python file that joins and enriches appropriately.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="97be" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Handling Change Data Capture (CDC)&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;One of SDP’s most powerful features is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;AUTO CDC&lt;/CODE&gt;, which handles change data capture with full support for out-of-order events. This is where things get genuinely hard in traditional pipelines — and trivial in SDP.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;SQL example for CDC with SCD Type 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Streaming table to capture raw CDC events&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers_cdc_raw&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/Volumes/raw_data/customers_cdc/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Cleansed CDC with expectations&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers_cdc_clean (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_id EXPECT (customer_id &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  customer_id,&lt;BR /&gt;  name,&lt;BR /&gt;  email,&lt;BR /&gt;  address,&lt;BR /&gt;  operation,&lt;BR /&gt;  operation_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(customers_cdc_raw);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Apply CDC changes with SCD Type 2 history tracking&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers;&lt;BR /&gt;&lt;BR /&gt;AUTO CDC &lt;SPAN class="hljs-keyword"&gt;INTO&lt;/SPAN&gt; customers&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(customers_cdc_clean)&lt;BR /&gt;KEYS (customer_id)&lt;BR /&gt;SEQUENCE &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; operation_timestamp&lt;BR /&gt;STORED &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; SCD TYPE &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;You can prompt Genie Code with something like:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Add change data capture for customer updates from Debezium CDC events. I need SCD Type 2 to track historical changes to customer addresses.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code understands the CDC patterns and generates the appropriate&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;AUTO CDC&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;declarations.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="8cfb" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Data Quality Expectations: Your Safety Net&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Expectations are SDP’s built-in data quality framework. There are three violation behaviors:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;BR /&gt;Behavior What Happens Use &lt;SPAN class="hljs-keyword"&gt;When&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt; Invalid &lt;SPAN class="hljs-keyword"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;are&lt;/SPAN&gt; silently dropped Tolerating messy source data&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION FAIL &lt;SPAN class="hljs-keyword"&gt;UPDATE&lt;/SPAN&gt; Entire pipeline &lt;SPAN class="hljs-keyword"&gt;update&lt;/SPAN&gt; fails Critical fields that must exist&lt;BR /&gt;(&lt;SPAN class="hljs-keyword"&gt;no&lt;/SPAN&gt; action specified) Invalid &lt;SPAN class="hljs-keyword"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;are&lt;/SPAN&gt; logged but kept Monitoring &lt;SPAN class="hljs-keyword"&gt;without&lt;/SPAN&gt; blocking&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;FIGURE class="nn no np nq nr ns nk nl paragraph-image"&gt;
&lt;DIV class="nk nl qx"&gt;&lt;PICTURE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1100w, https://miro.medium.com/v2/resize:fit:1162/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1162w" type="image/webp" sizes="auto, (min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 581px"&gt;&lt;/SOURCE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/1*JdnpPtnz_EA8b0i-NeY-4Q.png 640w, https://miro.medium.com/v2/resize:fit:720/1*JdnpPtnz_EA8b0i-NeY-4Q.png 720w, https://miro.medium.com/v2/resize:fit:750/1*JdnpPtnz_EA8b0i-NeY-4Q.png 750w, https://miro.medium.com/v2/resize:fit:786/1*JdnpPtnz_EA8b0i-NeY-4Q.png 786w, https://miro.medium.com/v2/resize:fit:828/1*JdnpPtnz_EA8b0i-NeY-4Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1100w, https://miro.medium.com/v2/resize:fit:1162/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1162w" sizes="auto, (min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 581px" data-testid="og"&gt;&lt;/SOURCE&gt;&lt;/PICTURE&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shwetav1407_2-1781633756700.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/27851iD9527053953A76C4/image-size/medium?v=v2&amp;amp;px=400" role="button" title="shwetav1407_2-1781633756700.png" alt="shwetav1407_2-1781633756700.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Pro tip:&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Use Genie Code to add expectations iteratively. After an initial pipeline run, ask:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“Analyze the bronze_orders data and suggest quality expectations for the silver layer based on the actual data distribution.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code can read the output datasets, profile the data, and propose expectations that make sense for your actual data — not just generic null checks.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="c541" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Production Patterns and Best Practices&lt;/H2&gt;
&lt;H3 id="86c7" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;1. Pipeline Configuration with YAML Spec&lt;/H3&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Your pipeline project uses a YAML spec file for top-level configuration:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;# pipeline.yaml&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;name:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;ecommerce_analytics&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;target_catalog:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;analytics&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;target_schema:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;ecommerce&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;libraries:&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./bronze_orders.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./silver_orders.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./gold_daily_revenue.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./gold_top_products.sql&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;configuration:&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-attr"&gt;spark.sql.shuffle.partitions:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;"auto"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H3 id="0336" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;2. Parameterize with SET&lt;/H3&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Use&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;SET&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to inject environment-specific configurations:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; env &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'production'&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; raw_path &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'/Volumes/${env}/raw_data/orders/'&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'${raw_path}'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H2 id="5033" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;3. Mix SQL and Python Files&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;A single pipeline can contain both SQL and Python source files. Use SQL for straightforward transformations and Python when you need UDFs, ML feature engineering, or complex business logic.&lt;/P&gt;
&lt;H2 id="a2f1" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;4. Use Genie Code for Ongoing Maintenance&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code doesn’t just build pipelines — it monitors them. It can:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="5269" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Triage failures&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;when a pipeline run breaks&lt;/LI&gt;
&lt;LI id="1554" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Investigate anomalies&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in data quality metrics&lt;/LI&gt;
&lt;LI id="389e" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Handle DBR upgrades&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;by updating deprecated syntax&lt;/LI&gt;
&lt;LI id="648c" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Optimize resource allocation&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;based on observed workload patterns&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Ask it things like:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“The silver_orders pipeline has been failing since yesterday. Diagnose the issue.”&lt;/EM&gt;&lt;/P&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“Optimize the compute configuration for this pipeline — it’s running slowly on large backfills.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="9665" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Wrapping Up&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;The combination of SDP and Genie Code represents a genuine paradigm shift for data engineering on Databricks. SDP eliminates the boilerplate of pipeline orchestration, and Genie Code eliminates the boilerplate of writing SDP. What used to take days of manual pipeline construction can now happen in a single conversation.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key takeaways:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="bf76" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Start with SDP&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— even without Genie Code, the declarative approach saves enormous amounts of manual orchestration code.&lt;/LI&gt;
&lt;LI id="aacf" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Use Genie Code Agent mode&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the Lakeflow Pipelines Editor to plan, generate, and validate entire pipelines from natural language.&lt;/LI&gt;
&lt;LI id="7f69" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Build iteratively&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— start with a basic bronze-silver-gold structure, then ask Genie Code to add CDC handling, expectations, and enrichments.&lt;/LI&gt;
&lt;LI id="d742" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Trust the loop&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Genie Code’s ability to run the pipeline, read outputs, diagnose errors, and fix them autonomously is the real superpower.&lt;/LI&gt;
&lt;LI id="d545" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Keep humans in control&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— every destructive action requires your approval. Genie Code proposes; you decide.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;SDP and Genie Code are both generally available today at no additional cost for all Databricks customers. Open the Lakeflow Pipelines Editor, flip on Agent mode, and start talking to your data infrastructure.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="nb"&gt;Ready to get started? Check out the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;A class="z qy" href="https://docs.databricks.com/aws/en/ldp/" rel="noopener ugc nofollow" target="_blank"&gt;&lt;EM class="nb"&gt;Databricks SDP documentation&lt;/EM&gt;&lt;/A&gt;&lt;EM class="nb"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;A class="z qy" href="https://docs.databricks.com/aws/en/ldp/de-agent" rel="noopener ugc nofollow" target="_blank"&gt;&lt;EM class="nb"&gt;Genie Code guide for pipeline development&lt;/EM&gt;&lt;/A&gt;&lt;EM class="nb"&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
    <pubDate>Tue, 16 Jun 2026 18:22:36 GMT</pubDate>
    <dc:creator>shwetav1407</dc:creator>
    <dc:date>2026-06-16T18:22:36Z</dc:date>
    <item>
      <title>Building Production-Ready SDP Pipelines with Genie Code: The Complete Guide</title>
      <link>https://community.databricks.com/t5/community-articles/building-production-ready-sdp-pipelines-with-genie-code-the/m-p/159195#M1281</link>
      <description>&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="nb"&gt;How Databricks’ AI agent transforms data engineering from manual craftsmanship into conversational pipeline development&lt;/EM&gt;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Data engineers have long accepted a painful truth: building production-grade ETL pipelines means wrestling with hundreds of lines of orchestration code, manually encoding execution order, handling incremental processing logic, and then praying nothing breaks at 2 AM. Spark Declarative Pipelines (SDP) already simplified this dramatically by letting you declare&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;what&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;your data should look like rather than&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;how&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to get there. Now, with Genie Code in Agent mode, you don’t even have to write those declarations yourself.&lt;/P&gt;
&lt;FIGURE class="nn no np nq nr ns nk nl paragraph-image"&gt;
&lt;DIV class="nt nu ek nv bd nw" tabindex="0" role="button"&gt;&lt;SPAN class="eo ep eq ai er es et eu ev speechify-ignore"&gt;Press enter or click to view image in full size&lt;/SPAN&gt;
&lt;DIV class="nk nl nm"&gt;&lt;PICTURE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*1VzZtaCw0WyY8glVdfkstA.png 1400w" type="image/webp" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"&gt;&lt;/SOURCE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/1*1VzZtaCw0WyY8glVdfkstA.png 640w, https://miro.medium.com/v2/resize:fit:720/1*1VzZtaCw0WyY8glVdfkstA.png 720w, https://miro.medium.com/v2/resize:fit:750/1*1VzZtaCw0WyY8glVdfkstA.png 750w, https://miro.medium.com/v2/resize:fit:786/1*1VzZtaCw0WyY8glVdfkstA.png 786w, https://miro.medium.com/v2/resize:fit:828/1*1VzZtaCw0WyY8glVdfkstA.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*1VzZtaCw0WyY8glVdfkstA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*1VzZtaCw0WyY8glVdfkstA.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" data-testid="og"&gt;&lt;/SOURCE&gt;&lt;/PICTURE&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shwetav1407_0-1781633757203.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/27852iC312D69CBA3164EB/image-size/medium?v=v2&amp;amp;px=400" role="button" title="shwetav1407_0-1781633757203.png" alt="shwetav1407_0-1781633757203.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;In this guide, we’ll walk through building a complete medallion architecture pipeline using Genie Code and SDP — from raw ingestion through business-ready analytics — and explore the patterns that make this approach production-worthy.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="f094" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;What Is SDP, and Why Should You Care?&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Lakeflow Spark Declarative Pipelines (SDP)&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is Databricks’ framework for building batch and streaming data pipelines in SQL and Python. Unlike traditional Spark jobs where you manually define execution order, manage checkpoints, and handle retries, SDP lets you declare your transformations and handles the orchestration automatically.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key benefits that matter for real-world pipelines:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="cd24" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Automatic orchestration&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— SDP analyzes dependencies across all your source files, builds a dataflow graph, and determines the optimal execution order with maximum parallelism. It also retries failures at the most granular level possible: first the Spark task, then the flow, then the pipeline.&lt;/LI&gt;
&lt;LI id="808f" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Incremental processing built in&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Materialized views automatically process only new data and changes. No more writing&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;MERGE&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;statements by hand.&lt;/LI&gt;
&lt;LI id="f435" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Data quality as code&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Expectations let you define quality constraints inline, right next to your transformations.&lt;/LI&gt;
&lt;LI id="16f3" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Unified batch and streaming&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Toggle between batch and streaming processing modes with a single keyword change.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Here’s what that looks like compared to traditional approaches:&lt;/P&gt;
&lt;H3 id="ed67" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;The Old Way (PySpark + Manual Orchestration)&lt;/H3&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;# Hundreds of lines for a simple weekly sales pipeline&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; SparkSession&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql.functions &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; col, &lt;SPAN class="hljs-built_in"&gt;sum&lt;/SPAN&gt;, window&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; delta.tables &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; DeltaTable&lt;BR /&gt;&lt;BR /&gt;spark = SparkSession.builder.getOrCreate()&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 1: Read raw data (manually handle incremental)&lt;/SPAN&gt;&lt;BR /&gt;raw_df = spark.read.&lt;SPAN class="hljs-built_in"&gt;format&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"delta"&lt;/SPAN&gt;).load(&lt;SPAN class="hljs-string"&gt;"/data/raw_sales"&lt;/SPAN&gt;)&lt;BR /&gt;last_processed = spark.read.&lt;SPAN class="hljs-built_in"&gt;format&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"delta"&lt;/SPAN&gt;) \&lt;BR /&gt;    .load(&lt;SPAN class="hljs-string"&gt;"/checkpoints/last_ts"&lt;/SPAN&gt;).collect()[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;][&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;new_data = raw_df.&lt;SPAN class="hljs-built_in"&gt;filter&lt;/SPAN&gt;(col(&lt;SPAN class="hljs-string"&gt;"event_time"&lt;/SPAN&gt;) &amp;gt; last_processed)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 2: Clean (manually write quality checks)&lt;/SPAN&gt;&lt;BR /&gt;cleaned = new_data.&lt;SPAN class="hljs-built_in"&gt;filter&lt;/SPAN&gt;(&lt;BR /&gt;    col(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;).isNotNull() &amp;amp; &lt;BR /&gt;    (col(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;) &amp;gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 3: Aggregate (manually handle upserts)&lt;/SPAN&gt;&lt;BR /&gt;weekly = cleaned.groupBy(&lt;BR /&gt;    window(&lt;SPAN class="hljs-string"&gt;"event_time"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"1 week"&lt;/SPAN&gt;), &lt;SPAN class="hljs-string"&gt;"region"&lt;/SPAN&gt;&lt;BR /&gt;).agg(&lt;SPAN class="hljs-built_in"&gt;sum&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"amount"&lt;/SPAN&gt;).alias(&lt;SPAN class="hljs-string"&gt;"total_sales"&lt;/SPAN&gt;))&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 4: Write (manually handle merge)&lt;/SPAN&gt;&lt;BR /&gt;target = DeltaTable.forPath(spark, &lt;SPAN class="hljs-string"&gt;"/data/weekly_sales"&lt;/SPAN&gt;)&lt;BR /&gt;target.alias(&lt;SPAN class="hljs-string"&gt;"t"&lt;/SPAN&gt;).merge(&lt;BR /&gt;    weekly.alias(&lt;SPAN class="hljs-string"&gt;"s"&lt;/SPAN&gt;),&lt;BR /&gt;    &lt;SPAN class="hljs-string"&gt;"t.window = s.window AND t.region = s.region"&lt;/SPAN&gt;&lt;BR /&gt;).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# Step 5: Update checkpoint (manually track state)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;# ... plus an Airflow DAG for scheduling, retries, alerting&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H3 id="6aef" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="ah"&gt;The SDP Way (SQL)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- The entire pipeline in a few declarations&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Bronze: raw ingestion with Auto Loader&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/data/landing/sales/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;,&lt;BR /&gt;  schema &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'event_time TIMESTAMP, region STRING, &lt;BR /&gt;             product STRING, amount DOUBLE'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Silver: cleansed with quality expectations&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; silver_sales (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_amount EXPECT (amount &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; not_null_region EXPECT (region &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  event_time,&lt;BR /&gt;  region,&lt;BR /&gt;  product,&lt;BR /&gt;  amount,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;current_timestamp&lt;/SPAN&gt;() &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; processed_at&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(bronze_sales);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold: business-ready weekly aggregation&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_weekly_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  date_trunc(&lt;SPAN class="hljs-string"&gt;'week'&lt;/SPAN&gt;, event_time) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; week_start,&lt;BR /&gt;  region,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; transaction_count,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(amount) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_sales,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(amount) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_transaction&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_sales&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; date_trunc(&lt;SPAN class="hljs-string"&gt;'week'&lt;/SPAN&gt;, event_time), region;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;That’s it. SDP handles incremental processing, execution order, retries, and checkpoint management. The bronze and silver tables use streaming semantics (the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;STREAM&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;keyword), while the gold materialized view uses batch semantics but still only reprocesses changed data.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="1ce0" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Enter Genie Code: Your AI Data Engineering Partner&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Now here’s where it gets interesting. Genie Code in Agent mode — available inside the Lakeflow Pipelines Editor — doesn’t just help you&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;write&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;SDP code. It can autonomously&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;plan, generate, run, validate, and fix&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;entire pipelines from a single natural language prompt.&lt;/P&gt;
&lt;H2 id="6ebd" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;How Genie Code Agent Mode Works&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;When you enable Agent mode in the Genie Code panel within the Lakeflow Pipelines Editor, the agent adapts its capabilities specifically for data engineering tasks. Unlike chat mode, Agent mode can:&lt;/P&gt;
&lt;OL class=""&gt;
&lt;LI id="809b" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Plan a multi-step solution&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and present it for your review&lt;/LI&gt;
&lt;LI id="1e1e" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Search your Unity Catalog&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for relevant tables, schemas, and lineage&lt;/LI&gt;
&lt;LI id="a111" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Generate SQL or Python SDP source files&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the pipeline editor&lt;/LI&gt;
&lt;LI id="28b7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Run pipeline updates&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and read the output datasets&lt;/LI&gt;
&lt;LI id="c7a6" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Diagnose and fix errors&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;automatically, iterating until the pipeline succeeds&lt;/LI&gt;
&lt;LI id="fb45" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Respect your Unity Catalog permissions&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— it can only access data you can access&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key design principle is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="nb"&gt;human-in-the-loop&lt;/EM&gt;: Genie Code proposes plans and asks for approval before executing. You can Allow, Decline, or ask it to try a different approach.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="5d29" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Tutorial: Building a Medallion Pipeline with Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Let’s walk through building a real pipeline — an e-commerce analytics pipeline that ingests order data, cleans and enriches it, and produces dashboards-ready metrics.&lt;/P&gt;
&lt;H2 id="61c2" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Prerequisites&lt;/H2&gt;
&lt;UL class=""&gt;
&lt;LI id="8c94" class="md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na pc pd pe bg" data-selectable-paragraph=""&gt;A Databricks workspace with&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Partner-powered AI features&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;enabled&lt;/LI&gt;
&lt;LI id="cf6c" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;Access to the Lakeflow Pipelines Editor&lt;/LI&gt;
&lt;LI id="ff20" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;Unity Catalog configured with a target catalog and schema&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="03a6" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 1: Create Your Pipeline and Open Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Navigate to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Pipelines&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the sidebar and create a new pipeline. Give it a name like&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;ecommerce_analytics&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and set your target catalog and schema (e.g.,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;analytics.ecommerce&lt;/CODE&gt;).&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Once in the Lakeflow Pipelines Editor, open the Genie Code panel and switch to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Agent mode&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 id="92ca" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 2: Prompt Genie Code to Build the Pipeline&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Start with a descriptive prompt that tells Genie Code what you want:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Build a medallion architecture pipeline for e-commerce analytics. I have raw order data landing as JSON files in /Volumes/raw_data/orders/ with fields: order_id, customer_id, product_id, quantity, unit_price, order_timestamp, and shipping_region. Create bronze ingestion with Auto Loader, silver cleansing with quality expectations, and gold aggregations for daily revenue by region and top products.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code will create a step-by-step plan that looks something like:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;Plan:&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;1.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Search&lt;/SPAN&gt; Unity Catalog &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; existing related tables&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;2.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; bronze_orders.sql — streaming &lt;SPAN class="hljs-keyword"&gt;table&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;with&lt;/SPAN&gt; Auto Loader&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;3.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; silver_orders.sql — cleaned data &lt;SPAN class="hljs-keyword"&gt;with&lt;/SPAN&gt; expectations&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;4.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; gold_daily_revenue.sql — daily revenue &lt;SPAN class="hljs-keyword"&gt;by&lt;/SPAN&gt; region&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;5.&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;Create&lt;/SPAN&gt; gold_top_products.sql — top products materialized &lt;SPAN class="hljs-keyword"&gt;view&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-number"&gt;6.&lt;/SPAN&gt; Run the pipeline &lt;SPAN class="hljs-keyword"&gt;and&lt;/SPAN&gt; validate outputs&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Review the plan, ask clarifying questions if needed, then select&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="mf go"&gt;Allow&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to let Genie Code proceed.&lt;/P&gt;
&lt;H2 id="214e" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 3: Watch Genie Code Generate Your Pipeline&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code creates each source file in your pipeline. Here’s what the generated code typically looks like:&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;bronze_orders.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Bronze layer: raw ingestion from JSON landing zone&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_orders&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Raw e-commerce orders ingested via Auto Loader'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt;,&lt;BR /&gt;  _metadata.file_name &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; source_file,&lt;BR /&gt;  _metadata.file_modification_time &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; file_mod_time,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;current_timestamp&lt;/SPAN&gt;() &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; ingestion_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/Volumes/raw_data/orders/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;,&lt;BR /&gt;  inferColumnTypes &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'true'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;silver_orders.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Silver layer: cleansed and validated orders&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; silver_orders (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_order_id &lt;BR /&gt;    EXPECT (order_id &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_quantity &lt;BR /&gt;    EXPECT (quantity &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;AND&lt;/SPAN&gt; quantity &lt;SPAN class="hljs-operator"&gt;&amp;lt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;10000&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_price &lt;BR /&gt;    EXPECT (unit_price &lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_timestamp &lt;BR /&gt;    EXPECT (order_timestamp &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;,&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_region &lt;BR /&gt;    EXPECT (shipping_region &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION FAIL &lt;SPAN class="hljs-keyword"&gt;UPDATE&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Cleansed orders with quality expectations enforced'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  order_id,&lt;BR /&gt;  customer_id,&lt;BR /&gt;  product_id,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(quantity &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;INT&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; quantity,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(unit_price &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;DOUBLE&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; unit_price,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(quantity &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;INT&lt;/SPAN&gt;) &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(unit_price &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;DOUBLE&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; line_total,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;CAST&lt;/SPAN&gt;(order_timestamp &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;TIMESTAMP&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; order_timestamp,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;UPPER&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;TRIM&lt;/SPAN&gt;(shipping_region)) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; shipping_region,&lt;BR /&gt;  ingestion_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(bronze_orders);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;gold_daily_revenue.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold layer: daily revenue metrics by region&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_daily_revenue&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Daily revenue aggregation by shipping region'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-type"&gt;DATE&lt;/SPAN&gt;(order_timestamp) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; order_date,&lt;BR /&gt;  shipping_region,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; order_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_orders,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; customer_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; unique_customers,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_revenue,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_order_value,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(quantity) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_units_sold&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;DATE&lt;/SPAN&gt;(order_timestamp), shipping_region;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;File:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;CODE class="db pk pl pm pn b"&gt;gold_top_products.sql&lt;/CODE&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Gold layer: top products by revenue&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH MATERIALIZED &lt;SPAN class="hljs-keyword"&gt;VIEW&lt;/SPAN&gt; gold_top_products&lt;BR /&gt;COMMENT &lt;SPAN class="hljs-string"&gt;'Product performance ranked by total revenue'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  product_id,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; order_id) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; times_ordered,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(quantity) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_units,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;SUM&lt;/SPAN&gt;(line_total) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; total_revenue,&lt;BR /&gt;  &lt;SPAN class="hljs-built_in"&gt;AVG&lt;/SPAN&gt;(unit_price) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; avg_price&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; silver_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; product_id;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H2 id="26fd" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;Step 4: Genie Code Runs and Validates&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;After generating the files, Genie Code asks for permission to run the pipeline. Once you approve it:&lt;/P&gt;
&lt;OL class=""&gt;
&lt;LI id="79c5" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Triggers a pipeline update&lt;/LI&gt;
&lt;LI id="40e7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Monitors execution across all flows&lt;/LI&gt;
&lt;LI id="b3f7" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Reads the output datasets to verify data landed correctly&lt;/LI&gt;
&lt;LI id="ae40" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na qs pd pe bg" data-selectable-paragraph=""&gt;Reports back with row counts, any expectation violations, and the DAG structure&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;If something fails — say a schema mismatch in the JSON files — Genie Code diagnoses the error, proposes a fix (like adjusting the schema inference or adding a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;CAST&lt;/CODE&gt;), and iterates until the pipeline succeeds.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="3e95" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Going Deeper: Python SDP with Genie Code&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;While SQL is the most common approach, SDP also supports Python for more complex transformation logic. The Python API uses decorators from the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;pyspark.pipelines&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;module (imported as&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;dp&lt;/CODE&gt;).&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Here’s what a Python-based silver layer might look like when you need custom transformation logic:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; pipelines &lt;SPAN class="hljs-keyword"&gt;as&lt;/SPAN&gt; dp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; pyspark.sql.functions &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; col, upper, trim, when, lit&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.table(&lt;SPAN class="hljs-params"&gt;&lt;BR /&gt;    name=&lt;SPAN class="hljs-string"&gt;"silver_orders_enriched"&lt;/SPAN&gt;,&lt;BR /&gt;    comment=&lt;SPAN class="hljs-string"&gt;"Orders enriched with derived customer segments"&lt;/SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.expect(&lt;SPAN class="hljs-params"&gt;&lt;SPAN class="hljs-string"&gt;"valid_order_id"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"order_id IS NOT NULL"&lt;/SPAN&gt;, on_violation=&lt;SPAN class="hljs-string"&gt;"drop"&lt;/SPAN&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-meta"&gt;@dp.expect(&lt;SPAN class="hljs-params"&gt;&lt;SPAN class="hljs-string"&gt;"valid_amount"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"line_total &amp;gt; 0"&lt;/SPAN&gt;, on_violation=&lt;SPAN class="hljs-string"&gt;"drop"&lt;/SPAN&gt;&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;def&lt;/SPAN&gt; &lt;SPAN class="hljs-title.function"&gt;silver_orders_enriched&lt;/SPAN&gt;():&lt;BR /&gt;    &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (&lt;BR /&gt;        spark.readStream.table(&lt;SPAN class="hljs-string"&gt;"bronze_orders"&lt;/SPAN&gt;)&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;, col(&lt;SPAN class="hljs-string"&gt;"quantity"&lt;/SPAN&gt;) * col(&lt;SPAN class="hljs-string"&gt;"unit_price"&lt;/SPAN&gt;))&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"shipping_region"&lt;/SPAN&gt;, upper(trim(col(&lt;SPAN class="hljs-string"&gt;"shipping_region"&lt;/SPAN&gt;))))&lt;BR /&gt;        .withColumn(&lt;BR /&gt;            &lt;SPAN class="hljs-string"&gt;"customer_segment"&lt;/SPAN&gt;,&lt;BR /&gt;            when(col(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;) &amp;gt;= &lt;SPAN class="hljs-number"&gt;500&lt;/SPAN&gt;, lit(&lt;SPAN class="hljs-string"&gt;"premium"&lt;/SPAN&gt;))&lt;BR /&gt;            .when(col(&lt;SPAN class="hljs-string"&gt;"line_total"&lt;/SPAN&gt;) &amp;gt;= &lt;SPAN class="hljs-number"&gt;100&lt;/SPAN&gt;, lit(&lt;SPAN class="hljs-string"&gt;"standard"&lt;/SPAN&gt;))&lt;BR /&gt;            .otherwise(lit(&lt;SPAN class="hljs-string"&gt;"basic"&lt;/SPAN&gt;))&lt;BR /&gt;        )&lt;BR /&gt;        .withColumn(&lt;SPAN class="hljs-string"&gt;"order_date"&lt;/SPAN&gt;, col(&lt;SPAN class="hljs-string"&gt;"order_timestamp"&lt;/SPAN&gt;).cast(&lt;SPAN class="hljs-string"&gt;"date"&lt;/SPAN&gt;))&lt;BR /&gt;    )&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;You can ask Genie Code specifically for Python implementations:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Add a Python-based silver transformation that enriches orders with a customer loyalty tier based on historical order count from the customers table in analytics.core.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code will search your Unity Catalog for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;customers&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;table, understand its schema, and generate a Python file that joins and enriches appropriately.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="97be" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Handling Change Data Capture (CDC)&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;One of SDP’s most powerful features is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;AUTO CDC&lt;/CODE&gt;, which handles change data capture with full support for out-of-order events. This is where things get genuinely hard in traditional pipelines — and trivial in SDP.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;SQL example for CDC with SCD Type 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;-- Streaming table to capture raw CDC events&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers_cdc_raw&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'/Volumes/raw_data/customers_cdc/'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Cleansed CDC with expectations&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers_cdc_clean (&lt;BR /&gt;  &lt;SPAN class="hljs-keyword"&gt;CONSTRAINT&lt;/SPAN&gt; valid_id EXPECT (customer_id &lt;SPAN class="hljs-keyword"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NOT&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;NULL&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt;&lt;BR /&gt;)&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;&lt;BR /&gt;  customer_id,&lt;BR /&gt;  name,&lt;BR /&gt;  email,&lt;BR /&gt;  address,&lt;BR /&gt;  operation,&lt;BR /&gt;  operation_timestamp&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(customers_cdc_raw);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-comment"&gt;-- Apply CDC changes with SCD Type 2 history tracking&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; customers;&lt;BR /&gt;&lt;BR /&gt;AUTO CDC &lt;SPAN class="hljs-keyword"&gt;INTO&lt;/SPAN&gt; customers&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM(customers_cdc_clean)&lt;BR /&gt;KEYS (customer_id)&lt;BR /&gt;SEQUENCE &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; operation_timestamp&lt;BR /&gt;STORED &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; SCD TYPE &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;You can prompt Genie Code with something like:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;&lt;EM class="gn"&gt;Your prompt:&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM class="gn"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;“Add change data capture for customer updates from Debezium CDC events. I need SCD Type 2 to track historical changes to customer addresses.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code understands the CDC patterns and generates the appropriate&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;AUTO CDC&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;declarations.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="v cf nc nd ne nf" role="separator"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="8cfb" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Data Quality Expectations: Your Safety Net&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Expectations are SDP’s built-in data quality framework. There are three violation behaviors:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;BR /&gt;Behavior What Happens Use &lt;SPAN class="hljs-keyword"&gt;When&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION &lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;ROW&lt;/SPAN&gt; Invalid &lt;SPAN class="hljs-keyword"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;are&lt;/SPAN&gt; silently dropped Tolerating messy source data&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;ON&lt;/SPAN&gt; VIOLATION FAIL &lt;SPAN class="hljs-keyword"&gt;UPDATE&lt;/SPAN&gt; Entire pipeline &lt;SPAN class="hljs-keyword"&gt;update&lt;/SPAN&gt; fails Critical fields that must exist&lt;BR /&gt;(&lt;SPAN class="hljs-keyword"&gt;no&lt;/SPAN&gt; action specified) Invalid &lt;SPAN class="hljs-keyword"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;are&lt;/SPAN&gt; logged but kept Monitoring &lt;SPAN class="hljs-keyword"&gt;without&lt;/SPAN&gt; blocking&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;FIGURE class="nn no np nq nr ns nk nl paragraph-image"&gt;
&lt;DIV class="nk nl qx"&gt;&lt;PICTURE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1100w, https://miro.medium.com/v2/resize:fit:1162/format:webp/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1162w" type="image/webp" sizes="auto, (min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 581px"&gt;&lt;/SOURCE&gt;&lt;SOURCE srcset="https://miro.medium.com/v2/resize:fit:640/1*JdnpPtnz_EA8b0i-NeY-4Q.png 640w, https://miro.medium.com/v2/resize:fit:720/1*JdnpPtnz_EA8b0i-NeY-4Q.png 720w, https://miro.medium.com/v2/resize:fit:750/1*JdnpPtnz_EA8b0i-NeY-4Q.png 750w, https://miro.medium.com/v2/resize:fit:786/1*JdnpPtnz_EA8b0i-NeY-4Q.png 786w, https://miro.medium.com/v2/resize:fit:828/1*JdnpPtnz_EA8b0i-NeY-4Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1100w, https://miro.medium.com/v2/resize:fit:1162/1*JdnpPtnz_EA8b0i-NeY-4Q.png 1162w" sizes="auto, (min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 581px" data-testid="og"&gt;&lt;/SOURCE&gt;&lt;/PICTURE&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shwetav1407_2-1781633756700.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/27851iD9527053953A76C4/image-size/medium?v=v2&amp;amp;px=400" role="button" title="shwetav1407_2-1781633756700.png" alt="shwetav1407_2-1781633756700.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/FIGURE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Pro tip:&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Use Genie Code to add expectations iteratively. After an initial pipeline run, ask:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“Analyze the bronze_orders data and suggest quality expectations for the silver layer based on the actual data distribution.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code can read the output datasets, profile the data, and propose expectations that make sense for your actual data — not just generic null checks.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="c541" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Production Patterns and Best Practices&lt;/H2&gt;
&lt;H3 id="86c7" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;1. Pipeline Configuration with YAML Spec&lt;/H3&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Your pipeline project uses a YAML spec file for top-level configuration:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-comment"&gt;# pipeline.yaml&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;name:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;ecommerce_analytics&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;target_catalog:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;analytics&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;target_schema:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;ecommerce&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;libraries:&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./bronze_orders.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./silver_orders.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./gold_daily_revenue.sql&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-bullet"&gt;-&lt;/SPAN&gt; &lt;SPAN class="hljs-attr"&gt;path:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;./gold_top_products.sql&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="hljs-attr"&gt;configuration:&lt;/SPAN&gt;&lt;BR /&gt;  &lt;SPAN class="hljs-attr"&gt;spark.sql.shuffle.partitions:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;"auto"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H3 id="0336" class="po oa gn bb ob pp pq pr of ps pt pu oj mo pv pw px ms py pz qa mw qb qc qd qe bg" data-selectable-paragraph=""&gt;2. Parameterize with SET&lt;/H3&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Use&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE class="db pk pl pm pn b"&gt;SET&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to inject environment-specific configurations:&lt;/P&gt;
&lt;PRE class="nn no np nq nr qf pn qg bl qh ax bg"&gt;&lt;SPAN class="qi oa gn pn b bc qj qk e ql qm" data-selectable-paragraph=""&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; env &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'production'&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;SET&lt;/SPAN&gt; raw_path &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'/Volumes/${env}/raw_data/orders/'&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; REFRESH STREAMING &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; bronze_orders&lt;BR /&gt;&lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;*&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; STREAM read_files(&lt;BR /&gt;  &lt;SPAN class="hljs-string"&gt;'${raw_path}'&lt;/SPAN&gt;,&lt;BR /&gt;  format &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="hljs-operator"&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;'json'&lt;/SPAN&gt;&lt;BR /&gt;);&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H2 id="5033" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;3. Mix SQL and Python Files&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;A single pipeline can contain both SQL and Python source files. Use SQL for straightforward transformations and Python when you need UDFs, ML feature engineering, or complex business logic.&lt;/P&gt;
&lt;H2 id="a2f1" class="nz oa gn bb ob oc qn oe of og qo oi oj ok qp om on oo qq oq or os qr ou ov ow bg" data-selectable-paragraph=""&gt;4. Use Genie Code for Ongoing Maintenance&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;Genie Code doesn’t just build pipelines — it monitors them. It can:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="5269" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Triage failures&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;when a pipeline run breaks&lt;/LI&gt;
&lt;LI id="1554" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Investigate anomalies&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in data quality metrics&lt;/LI&gt;
&lt;LI id="389e" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Handle DBR upgrades&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;by updating deprecated syntax&lt;/LI&gt;
&lt;LI id="648c" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Optimize resource allocation&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;based on observed workload patterns&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;Ask it things like:&lt;/P&gt;
&lt;BLOCKQUOTE class="qt qu qv"&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“The silver_orders pipeline has been failing since yesterday. Diagnose the issue.”&lt;/EM&gt;&lt;/P&gt;
&lt;P class="md me nb mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="gn"&gt;“Optimize the compute configuration for this pipeline — it’s running slowly on large backfills.”&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;H2 id="9665" class="nz oa gn bb ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow bg" data-selectable-paragraph=""&gt;Wrapping Up&lt;/H2&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg ox mi mj mk oy mm mn mo oz mq mr ms pa mu mv mw pb my mz na gg bg" data-selectable-paragraph=""&gt;The combination of SDP and Genie Code represents a genuine paradigm shift for data engineering on Databricks. SDP eliminates the boilerplate of pipeline orchestration, and Genie Code eliminates the boilerplate of writing SDP. What used to take days of manual pipeline construction can now happen in a single conversation.&lt;/P&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;The key takeaways:&lt;/P&gt;
&lt;UL class=""&gt;
&lt;LI id="bf76" class="md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Start with SDP&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— even without Genie Code, the declarative approach saves enormous amounts of manual orchestration code.&lt;/LI&gt;
&lt;LI id="aacf" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Use Genie Code Agent mode&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;in the Lakeflow Pipelines Editor to plan, generate, and validate entire pipelines from natural language.&lt;/LI&gt;
&lt;LI id="7f69" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Build iteratively&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— start with a basic bronze-silver-gold structure, then ask Genie Code to add CDC handling, expectations, and enrichments.&lt;/LI&gt;
&lt;LI id="d742" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Trust the loop&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— Genie Code’s ability to run the pipeline, read outputs, diagnose errors, and fix them autonomously is the real superpower.&lt;/LI&gt;
&lt;LI id="d545" class="md me gn mf b mg pf mi mj mk pg mm mn mo ph mq mr ms pi mu mv mw pj my mz na pc pd pe bg" data-selectable-paragraph=""&gt;&lt;STRONG class="mf go"&gt;Keep humans in control&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— every destructive action requires your approval. Genie Code proposes; you decide.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;SDP and Genie Code are both generally available today at no additional cost for all Databricks customers. Open the Lakeflow Pipelines Editor, flip on Agent mode, and start talking to your data infrastructure.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="gg gh gi gj gk"&gt;
&lt;DIV class="v cf"&gt;
&lt;DIV class="cm bd fs ft fu fv"&gt;
&lt;P class="pw-post-body-paragraph md me gn mf b mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na gg bg" data-selectable-paragraph=""&gt;&lt;EM class="nb"&gt;Ready to get started? Check out the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;A class="z qy" href="https://docs.databricks.com/aws/en/ldp/" rel="noopener ugc nofollow" target="_blank"&gt;&lt;EM class="nb"&gt;Databricks SDP documentation&lt;/EM&gt;&lt;/A&gt;&lt;EM class="nb"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/EM&gt;&lt;A class="z qy" href="https://docs.databricks.com/aws/en/ldp/de-agent" rel="noopener ugc nofollow" target="_blank"&gt;&lt;EM class="nb"&gt;Genie Code guide for pipeline development&lt;/EM&gt;&lt;/A&gt;&lt;EM class="nb"&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Tue, 16 Jun 2026 18:22:36 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/building-production-ready-sdp-pipelines-with-genie-code-the/m-p/159195#M1281</guid>
      <dc:creator>shwetav1407</dc:creator>
      <dc:date>2026-06-16T18:22:36Z</dc:date>
    </item>
    <item>
      <title>Re: Building Production-Ready SDP Pipelines with Genie Code: The Complete Guide</title>
      <link>https://community.databricks.com/t5/community-articles/building-production-ready-sdp-pipelines-with-genie-code-the/m-p/160162#M1301</link>
      <description>&lt;P&gt;Great Overview, Thanks for sharing with the community.&lt;/P&gt;</description>
      <pubDate>Tue, 23 Jun 2026 00:23:22 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/building-production-ready-sdp-pipelines-with-genie-code-the/m-p/160162#M1301</guid>
      <dc:creator>Mycimmunity</dc:creator>
      <dc:date>2026-06-23T00:23:22Z</dc:date>
    </item>
  </channel>
</rss>

