<?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>Technical Blog articles</title>
    <link>https://community.databricks.com/t5/technical-blog/bg-p/technical-blog</link>
    <description>Technical Blog articles</description>
    <pubDate>Sun, 23 Aug 2026 12:40:07 GMT</pubDate>
    <dc:creator>technical-blog</dc:creator>
    <dc:date>2026-08-23T12:40:07Z</dc:date>
    <item>
      <title>Identity Columns Best Practices for Databricks Lakehouse</title>
      <link>https://community.databricks.com/t5/technical-blog/identity-columns-best-practices-for-databricks-lakehouse/ba-p/165769</link>
      <description>&lt;P&gt;Every data warehouse eventually needs surrogate keys, and for years that meant sequence objects, auto-increment columns, and a pile of ETL whose only job was handing out the next number. Databricks Lakehouse builds identity columns straight into Delta tables, so most of that machinery just disappears.&lt;/P&gt;
&lt;P&gt;But they don't behave quite like the auto-increment you're used to. Assume they do, and you'll spend a frustrating afternoon working out why your row count and your maximum key value disagree.&lt;/P&gt;
&lt;P&gt;This post is the field guide to using them well:&lt;/P&gt;
&lt;P&gt;- GENERATED ALWAYS vs BY DEFAULT and the one-line SYNC IDENTITY fix that saves you from two rows fighting over the same key&lt;BR /&gt;- Why gaps are a feature, not a bug, and the three assumptions that quietly break when someone reads meaning into them&lt;BR /&gt;- The upsert and SCD Type 2 patterns where surrogate keys truly earn their keep including how AUTO CDC in Spark Declarative Pipelines does the expire-and-insert for you&lt;BR /&gt;- Where identity columns don't belong: clustering keys, high-throughput streaming, and other traps&lt;/P&gt;
&lt;P&gt;If you're modernizing off Oracle sequences or SQL Server IDENTITY, this is also the cheapest chance you'll get to drop that technical debt for good.&lt;/P&gt;
&lt;P&gt;Let the table do the boring work of handing out keys. Here's how to get it right.&lt;/P&gt;</description>
      <pubDate>Tue, 18 Aug 2026 11:22:44 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/identity-columns-best-practices-for-databricks-lakehouse/ba-p/165769</guid>
      <dc:creator>LaurentLeturgez</dc:creator>
      <dc:date>2026-08-18T11:22:44Z</dc:date>
    </item>
    <item>
      <title>DABs Migration Guide: Terraform to the Direct Deployment Engine</title>
      <link>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/ba-p/165694</link>
      <description>&lt;P&gt;A guide to migrate an existing Declarative Automation Bundle from the Terraform deployment engine to the direct deployment engine. It covers the standard procedure, when bundle deployment bind is required, and five behaviours that surfaced during a customer migration, and a worked example of adopting a Genie space into the bundle.&lt;/P&gt;</description>
      <pubDate>Tue, 18 Aug 2026 09:25:25 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/ba-p/165694</guid>
      <dc:creator>himanshu_ranjan</dc:creator>
      <dc:date>2026-08-18T09:25:25Z</dc:date>
    </item>
    <item>
      <title>Beyond Prompting: Production-Ready Image Generation and Visual Asset Management on Databricks</title>
      <link>https://community.databricks.com/t5/technical-blog/beyond-prompting-production-ready-image-generation-and-visual/ba-p/165461</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Generative AI for images has graduated from experimental prompts to critical business workloads. Learn how to build a unified, governed engine that brings image creation, editing, analysis, and management under a single roof.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 17 Aug 2026 12:59:37 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/beyond-prompting-production-ready-image-generation-and-visual/ba-p/165461</guid>
      <dc:creator>andreas-kopp_da</dc:creator>
      <dc:date>2026-08-17T12:59:37Z</dc:date>
    </item>
    <item>
      <title>LLMOps for Data Scientists and AI Builders: A Quickstart on Databricks</title>
      <link>https://community.databricks.com/t5/technical-blog/llmops-for-data-scientists-and-ai-builders-a-quickstart-on/ba-p/165491</link>
      <description>&lt;P&gt;Building an LLM prototype is easy. Making it reproducible, measurable, and governed is the part that takes work. This quickstart carries one support-ticket classifier through the whole lifecycle on Databricks: an agent served as an App, its LLM governed through a Unity AI Gateway model service, and an MLflow 3 evaluation gate before anything ships.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 17:09:14 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/llmops-for-data-scientists-and-ai-builders-a-quickstart-on/ba-p/165491</guid>
      <dc:creator>CarlosDip</dc:creator>
      <dc:date>2026-08-12T17:09:14Z</dc:date>
    </item>
    <item>
      <title>Migrate your Dashboards to AI/BI with Genie Code</title>
      <link>https://community.databricks.com/t5/technical-blog/migrate-your-dashboards-to-ai-bi-with-genie-code/ba-p/164326</link>
      <description>&lt;P&gt;Learn how to use Genie Code to migrate your Dashboards to Databricks AI/BI!&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 11:42:41 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/migrate-your-dashboards-to-ai-bi-with-genie-code/ba-p/164326</guid>
      <dc:creator>pedrozanlorensi</dc:creator>
      <dc:date>2026-08-12T11:42:41Z</dc:date>
    </item>
    <item>
      <title>Triggered vs. Continuous Mode: A Deep Dive into Serverless Lakeflow Spark Declarative Pipelines</title>
      <link>https://community.databricks.com/t5/technical-blog/triggered-vs-continuous-mode-a-deep-dive-into-serverless/ba-p/164327</link>
      <description>&lt;P&gt;&lt;SPAN&gt;One pipeline woke up every five minutes. The other stayed running.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Using the same e-commerce streaming workload, &lt;/SPAN&gt;&lt;STRONG&gt;median end-to-end data freshness improved from 4.0 minutes to 33 seconds&lt;/STRONG&gt;&lt;SPAN&gt;, while &lt;/SPAN&gt;&lt;STRONG&gt;P95 latency dropped from 9.3 minutes to just 60 seconds&lt;/STRONG&gt;&lt;SPAN&gt;. Those results were expected for a continuously running pipeline. What wasn't expected was what we found inside the Serverless Spark Declarative Pipeline itself: &lt;/SPAN&gt;&lt;STRONG&gt;driver logs showed that eligible streaming queries could have two or more&amp;nbsp; micro-batches in flight simultaneously&lt;/STRONG&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;That behavior is enabled by &lt;/SPAN&gt;&lt;STRONG&gt;stream pipelining&lt;/STRONG&gt;&lt;SPAN&gt;, a Serverless Spark Declarative Pipelines (SDP) optimization that overlaps work across successive micro-batches instead of waiting for one batch to fully complete before beginning the next. For workloads where processing time exceeds the configured trigger interval, this can significantly improve resource utilization and reduce end-to-end latency while preserving the familiar Spark Structured Streaming programming model.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;What you'll learn&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;When to choose Triggered or Continuous mode&lt;/STRONG&gt;&lt;SPAN&gt; based on workload characteristics and data freshness requirements.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;How stream pipelining works internally&lt;/STRONG&gt;&lt;SPAN&gt; and how it differs from the traditional sequential execution model of Spark Structured Streaming.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;What we observed in production-style benchmarks and driver logs&lt;/STRONG&gt;&lt;SPAN&gt;, including evidence of overlapping micro-batches and the resulting impact on latency and throughput.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;FONT color="#000000"&gt;&lt;STRONG&gt;The Setup&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;To make the comparison concrete, We built an e-commerce order-processing benchmark that represents workloads that can have both periodic analytics requirements and near-real-time operational requirements such as fraud detection and live revenue monitoring.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1785268352011.png" style="width: 844px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29528iA9C414DECA1E44A2/image-dimensions/844x477?v=v2" width="844" height="477" role="button" title="smunigati_0-1785268352011.png" alt="smunigati_0-1785268352011.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Producer: ~5,000 orders/min (~15,000 line items/min after explode)&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Kafka: Amazon MSK cluster with TLS, connected through PrivateLink in a AWS us-west-2 region. Both Databricks and Kafka cluster running in the same region.&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Compute: Serverless SDP for both pipelines using defaults settings.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Pipeline architecture at high level: Bronze → Silver → Gold&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Transforms: 25+ identical transformations in the Silver layer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Test conducted during the 07/13/2026 EST timezone. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;Each order contains a nested items array with 1–5 items (about three on average), so explode() amplifies the data volume by roughly 3×. The Silver layer applies SHA-256 hashes, regex extraction, multi-factor fraud scoring, state-based tax calculation, shipping-zone classification, price normalization, and other transformations.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The primary execution difference is that one pipeline runs in Triggered mode on a five-minute schedule, while the other remains active in Continuous mode and both pipelines read from the same kafka topic concurrently. The Continuous pipeline uses a 1-second trigger interval for Bronze and Silver and a 30-second interval for Gold.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Triggered vs. Continuous: The First Architectural Decision&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;Before looking at stream pipelining, it is important to separate two questions. The first is a pipeline lifecycle decision: should the pipeline wake up periodically, process available data, and stop—or should it remain active and continuously process new data?&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Triggered Mode: Process, Stop, and Start Again&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;In Triggered mode, each scheduled invocation runs a pipeline lifecycle: compute is made available, the pipeline initializes, sources are connected, available data is processed, progress is committed, and the run terminates. The pipeline then waits until the next scheduled invocation and data that is continuously arrived after pipeline starts will wait for the next update. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1785268708916.png" style="width: 850px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29529i34AA9CF23FBC077F/image-dimensions/850x512?v=v2" width="850" height="512" role="button" title="smunigati_0-1785268708916.png" alt="smunigati_0-1785268708916.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In our benchmark, a full Triggered lifecycle took 153–194 seconds, averaging about 177 seconds per invocation. With a five-minute schedule, this created a pattern of active processing followed by idle time before the next scheduled run. In this case each cycle includes: provisioning serverless compute, JVM initialization, pipeline graph setup, Kafka consumer group creation, data processing, checkpoint commit, and teardown.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Continuous Mode: Start Once and Keep Processing&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;In Continuous mode, the pipeline starts and remains active. New data is processed through successive micro-batches according to the configured trigger intervals, and these trigger intervals can be configured at pipeline level or at each flow/table level, without repeating the full pipeline startup and teardown lifecycle for every scheduled processing window.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_1-1785268794084.png" style="width: 844px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29530iE5CFAAB3EB5F81C7/image-dimensions/844x499?v=v2" width="844" height="499" role="button" title="smunigati_1-1785268794084.png" alt="smunigati_1-1785268794084.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;For workloads with continuously arriving data, continuous mode provides a more consistent execution model while avoiding repeated lifecycle overhead. In our benchmark, the Silver layer processed approximately 1,400 line items per batch across more than 25 transformations. The roughly 766 ms lightweight-processing time shown in the example above is intended only to illustrate how continuous mode works; it does not represent the actual Silver-layer pipeline used in the benchmark below.After the one-time startup, micro-batches fire continuously with sub-second processing times. No cold start, no teardown, no wasted compute.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;When Should You Use Each Mode?&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;The choice should be driven by workload characteristics rather than by assuming that Continuous mode is always better.&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="31px"&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color="#000000"&gt;Consideration&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="31px"&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color="#000000"&gt;Triggered Mode&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="31px"&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color="#000000"&gt;Continuous Mode&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Data arrival&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Periodic, bursty, hourly, or daily&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Continuous or frequent event arrival&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Freshness requirement&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Minutes to hours can be acceptable&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Sub-minute to few-minute freshness&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Idle periods&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Long idle periods between arrivals&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Steady or frequent incoming data&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Pipeline lifecycle&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Starts and stops for each invocation&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Remains active&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="77px"&gt;
&lt;P&gt;&lt;SPAN&gt;Typical use cases&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="77px"&gt;
&lt;P&gt;&lt;SPAN&gt;Periodic ETL, hourly fulfillment, daily reporting&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="77px"&gt;
&lt;P&gt;&lt;SPAN&gt;Fraud detection, live dashboards, inventory tracking, CDC&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="217.969px" height="105px"&gt;
&lt;P&gt;&lt;SPAN&gt;Primary trade-off&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="325px" height="105px"&gt;
&lt;P&gt;&lt;SPAN&gt;Avoid unnecessary active execution during idle periods which eventually saves the execution cost.&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="275px" height="105px"&gt;
&lt;P&gt;&lt;SPAN&gt;Consistent low-latency processing and steady-state execution&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;Triggered mode therefore remains a valid—and often preferable—choice when data arrives infrequently or when latency is not critical. Continuous mode becomes more compelling when data arrives continuously and downstream consumers expect consistently fresh results.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;SPAN&gt;&lt;STRONG&gt;Benchmark Result: The Lifecycle Choice Affects Data Freshness&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;We measured end-to-end data freshness as processed_at - order_timestamp: the time from when an order was created until it appeared in the enriched Silver table.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1786218911250.png" style="width: 838px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29821iB8CB76619378BE15/image-dimensions/838x459?v=v2" width="838" height="459" role="button" title="smunigati_0-1786218911250.png" alt="smunigati_0-1786218911250.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;For this workload and five-minute Triggered schedule, Continuous mode delivered substantially fresher data. That result is useful, but it is not the entire story. Once Continuous mode is selected, Serverless SDP introduces another optimization worth understanding: Stream Pipelining.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Going Deeper: What Is Different Inside Continuous Mode?&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;This is where the second comparison begins. &lt;/STRONG&gt;&lt;SPAN&gt;Triggered versus Continuous describes the pipeline lifecycle. Stream pipelining describes how eligible micro-batches can be executed within a continuously running Serverless SDP pipeline.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;To understand why this matters, consider a simple question: what happens when a streaming query has a 1-second trigger interval, but each micro-batch takes more than one second to complete?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Classic Spark Structured Streaming: Sequential Micro-Batch Execution&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;In the traditional Spark Structured Streaming micro-batch execution pattern, a streaming query processes micro-batches sequentially. Spark still parallelizes tasks and stages within each micro-batch, but successive micro-batches of the same query do not independently execute as fully overlapping batches.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1785269128660.png" style="width: 844px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29531iC75F93DBAE42A49E/image-dimensions/844x513?v=v2" width="844" height="513" role="button" title="smunigati_0-1785269128660.png" alt="smunigati_0-1785269128660.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;An important distinction: &lt;/STRONG&gt;&lt;SPAN&gt;Spark task parallelism within a micro-batch is not the same thing as micro-batch pipelining across batches. The comparison here is specifically about whether work associated with Batch N+1 can overlap with work from Batch N.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;If a micro-batch takes longer than the configured trigger interval, the next batch must wait for the current batch to finish before it can start&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The above figure illustrates exactly how standard Spark Structured Streaming executes micro-batches strictly one at a time. Each micro-batch must complete all phases—Plan, Execute, Write, and Commit—before the next micro-batch can begin, even if the configured trigger interval is shorter than the batch processing time. As a result, the effective trigger interval increases from 1,000 ms to 1,450 ms, leaving the compute idle between batches and reducing overall resource utilization and throughput.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Certain resources are underutilized during phases (writing to Delta, committing checkpoints) that do not saturate the cluster, pipelining can use otherwise available capacity for a subsequent batch.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Serverless SDP: Stream-Pipelined Micro-Batch Execution&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;Databricks &lt;/SPAN&gt;&lt;A href="https://docs.databricks.com/aws/en/ldp/serverless#serverless-pipeline-features" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;docs&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt; describe it simply:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN&gt;"Instead of running microbatches sequentially like standard Spark Structured Streaming, serverless Lakeflow Spark Declarative Pipelines runs microbatches concurrently, improving compute resource utilization. Stream pipelining is enabled by default in serverless pipelines."&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;But what does "concurrently" actually mean? Let's visualize it.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;For eligible streaming queries, Serverless Lakeflow Spark Declarative Pipelines can use stream pipelining. Instead of requiring strictly serial end-to-end completion of successive micro-batches, the engine can overlap eligible work across batches.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1785269525393.png" style="width: 845px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29532i02B12364C305F9E3/image-dimensions/845x511?v=v2" width="845" height="511" role="button" title="smunigati_0-1785269525393.png" alt="smunigati_0-1785269525393.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Conceptually, while an earlier batch is completing later work such as writing and committing, a subsequent batch can already be progressing. The pipeline remains micro-batch based; stream pipelining adds another dimension of execution concurrency.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The key insight: while batch 1 is writing data to Delta and committing the checkpoint, batch 2 is already reading from source and executing its transformations. The CPU cores that would be idle during I/O wait are now processing the next batch.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;How Deep Can Pipelining Go?&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;Our benchmark showed that overlap was not limited to two batches. In the Silver query, we observed cases where up to three micro-batches were in flight simultaneously.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_1-1785269611587.png" style="width: 844px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29533i923E000D68A5459F/image-dimensions/844x555?v=v2" width="844" height="555" role="button" title="smunigati_1-1785269611587.png" alt="smunigati_1-1785269611587.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The Silver layer was configured with a 1-second trigger interval, while its average batch duration was 2,242 ms. This created sustained pressure where processing duration exceeded the configured cadence—exactly the scenario where pipelined execution becomes particularly relevant.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Going Under the Hood: What Do the Driver Logs Tell Us?&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;So far, we’ve seen conceptually how stream pipelining allows micro-batches to overlap. Now, let’s go one level deeper and look at what actually happens under the hood.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;We analyzed approximately &lt;/SPAN&gt;&lt;STRONG&gt;230 MB of driver logs from a 30-minute Continuous-mode benchmark run&lt;/STRONG&gt;&lt;SPAN&gt; to understand how Serverless SDP schedules and overlaps micro-batches during execution. SDP engine logs specific strings that encode its internal decisions and per-batch timings. The method was to grep those out and count/bucket them.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Pipelining Is Enabled at the Streaming Query Level:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;The engine logs an explicit status message for each streaming query at startup:&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;INFO MicroBatchExecution: [queryId = c831c] Pipelined execution is enabled
  for query c831c9dc-073f-4d03-876f-85c7e23114d2.
  Reason:
    isServerless                        = true
    pipeliningEnabledInServerless       = true
    isStateful                          = false    &amp;lt;-- stateless = eligible
    deltaSinkWithCompleteMode           = false    &amp;lt;-- append mode = eligible
    sinkSupport                         = true
    sourcesSupport                      = true
    isPipeliningForceDisabled           = false
    isStatefulPipeliningForceDisabled   = false
    sameDeltaSourceSink                 = false
&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN&gt;All four streaming queries in the benchmark logged pipelining as enabled, including the Gold query. Eligibility is evaluated per query.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;What Micro-Batch Overlap Looks Like in Practice:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;The micro-batch pipelining progress metrics give us an even deeper view into what is happening during execution. In the Silver query, &lt;/SPAN&gt;&lt;STRONG&gt;99.7% of the observed batches showed overlap&lt;/STRONG&gt;&lt;SPAN&gt;. Most had two micro-batches in flight, while 6.1% showed three micro-batches in flight simultaneously.&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE width="818px"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="258.576px" height="50px"&gt;
&lt;P&gt;&lt;STRONG&gt;Query&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="228.507px" height="50px"&gt;
&lt;P&gt;&lt;STRONG&gt;No overlap&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="200.451px" height="50px"&gt;
&lt;P&gt;&lt;STRONG&gt;2 in flight&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="129.34px" height="50px"&gt;
&lt;P&gt;&lt;STRONG&gt;3 in flight&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="258.576px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Silver&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="228.507px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;1 (0.3%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="200.451px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;308 (93.6%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="129.34px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;20 (6.1%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="258.576px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Bronze&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="228.507px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;5 (1.6%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="200.451px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;315 (98.4%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="129.34px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="258.576px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Gold&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="228.507px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;60 (100%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="200.451px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="129.34px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="258.576px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Metrics&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="228.507px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;312 (99.4%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="200.451px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;2 (0.6%)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="129.34px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;Here's the raw log entry showing 3 concurrent batches in silver:&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;[queryId = c831c] [batchId = 96] Streaming query made progress:
  "timestamp"     : "2026-07-13T02:30:59.729Z",   &amp;lt;-- batch 96 STARTS
  "batchDuration" : 2270,    &amp;lt;-- runs until 02:31:01.999Z
  "numInputRows"  : 106

[queryId = c831c] [batchId = 97] Streaming query made progress:
  "timestamp"     : "2026-07-13T02:31:00.729Z",   &amp;lt;-- batch 97 STARTS (1.0s later)
  "batchDuration" : 2457,   &amp;lt;-- runs until 02:31:03.186Z
  "numInputRows"  : 394

&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN&gt;Batch 97 begins 1.0s after batch 96, but batch 96 keeps running for another 1.27s. Their execution windows overlap by 1,270 ms: two micro-batches processing concurrently against a 1s trigger.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Batch Duration vs. Trigger Interval&lt;/STRONG&gt;&lt;/H1&gt;
&lt;TABLE width="836px"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="218.49px"&gt;
&lt;P&gt;&lt;STRONG&gt;Query&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="97.2049px"&gt;
&lt;P&gt;&lt;STRONG&gt;Trigger&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="208.455px"&gt;
&lt;P&gt;&lt;STRONG&gt;Avg Batch Duration&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="206.458px"&gt;
&lt;P&gt;&lt;STRONG&gt;Exceeds Trigger&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="104.271px"&gt;
&lt;P&gt;&lt;STRONG&gt;Batches&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="218.49px"&gt;
&lt;P&gt;&lt;SPAN&gt;Silver&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="97.2049px"&gt;
&lt;P&gt;&lt;SPAN&gt;1s&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="208.455px"&gt;
&lt;P&gt;&lt;SPAN&gt;2,242 ms (2.2×)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="206.458px"&gt;
&lt;P&gt;&lt;SPAN&gt;100%&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="104.271px"&gt;
&lt;P&gt;&lt;SPAN&gt;329&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="218.49px"&gt;
&lt;P&gt;&lt;SPAN&gt;Bronze&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="97.2049px"&gt;
&lt;P&gt;&lt;SPAN&gt;1s&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="208.455px"&gt;
&lt;P&gt;&lt;SPAN&gt;1,421 ms (1.4×)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="206.458px"&gt;
&lt;P&gt;&lt;SPAN&gt;99.7%&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="104.271px"&gt;
&lt;P&gt;&lt;SPAN&gt;320&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="218.49px"&gt;
&lt;P&gt;&lt;SPAN&gt;Gold&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="97.2049px"&gt;
&lt;P&gt;&lt;SPAN&gt;30s&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="208.455px"&gt;
&lt;P&gt;&lt;SPAN&gt;7,885 ms (0.26×)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="206.458px"&gt;
&lt;P&gt;&lt;SPAN&gt;0%&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="104.271px"&gt;
&lt;P&gt;&lt;SPAN&gt;60&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="218.49px"&gt;
&lt;P&gt;&lt;SPAN&gt;Metrics&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="97.2049px"&gt;
&lt;P&gt;&lt;SPAN&gt;1s&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="208.455px"&gt;
&lt;P&gt;&lt;SPAN&gt;2,387 ms (2.4×)&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="206.458px"&gt;
&lt;P&gt;&lt;SPAN&gt;96.5%&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="104.271px"&gt;
&lt;P&gt;&lt;SPAN&gt;314&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;The Silver query is the clearest example: average processing duration was more than twice the trigger interval, and nearly every observed batch showed overlap. The Gold query, by contrast, completed well within its 30-second interval and showed no observed batch overlap in this run. &lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Cross-Table Parallelism: The Other Dimension&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1785270003358.png" style="width: 842px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29534i2C9802BF8B0749C1/image-dimensions/842x579?v=v2" width="842" height="579" role="button" title="smunigati_0-1785270003358.png" alt="smunigati_0-1785270003358.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Across tables: different tables in the pipeline can execute as independent streaming queries.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Within a query: eligible successive micro-batches can overlap through stream pipelining.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;These dimensions are in addition to Spark's normal parallel execution of tasks within an individual micro-batch.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Which Queries Can Benefit from Pipelining?&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;Not every streaming query is guaranteed to use stream pipelining. The engine evaluates eligibility independently for each query.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_0-1786219283783.png" style="width: 739px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29822i213426014F631D90/image-dimensions/739x863?v=v2" width="739" height="863" role="button" title="smunigati_0-1786219283783.png" alt="smunigati_0-1786219283783.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;An interesting finding in our benchmark was that the Gold query in this environment logged pipelining enabled despite state, then note it showed no actual overlap because its duration was below the trigger. It used a watermark with approx_count_distinct and append-mode output. This suggests that eligibility should be understood at the query level rather than reduced to a simple rule that all stateful queries are excluded.&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;The Complete Picture&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="smunigati_2-1785270107018.png" style="width: 836px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29536i5A755298EC631CB1/image-dimensions/836x550?v=v2" width="836" height="550" role="button" title="smunigati_2-1785270107018.png" alt="smunigati_2-1785270107018.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The complete comparison therefore has two levels. First, choose Triggered or Continuous mode based on workload arrival patterns, latency requirements, idle time, and operational goals. Second, when Continuous mode is the right choice, Serverless SDP can provide an additional execution advantage through stream pipelining for eligible queries.&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;&lt;STRONG&gt;Practical Recommendations&lt;/STRONG&gt;&lt;/H1&gt;
&lt;H2&gt;&lt;STRONG&gt;Use Triggered Mode When:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Data arrives in infrequent or predictable bursts, such as hourly or daily loads.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;There are long idle periods between data arrivals.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Processing latency is not critical and several minutes—or longer—is acceptable.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;The workload is periodic ETL or reporting rather than continuous operational processing.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Avoiding active pipeline execution during long idle windows is an important consideration.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;Use Continuous Mode When:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Data arrives continuously from sources such as Kafka, CDC feeds, or event streams.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Sub-minute to few-minute freshness matters.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;The workload supports operational use cases such as fraud detection, live dashboards, or inventory tracking.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;A steady-state pipeline is preferable to repeated startup and teardown cycles.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;After Continuous is justified by the freshness SLO, eligible queries may gain additional utilization/throughput benefits from stream pipelining.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;When Tuning Continuous Pipelines:&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Choose trigger intervals based primarily on freshness requirements and workload characteristics—not simply to force overlap.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;I&gt;Warning :&lt;/I&gt;&lt;/STRONG&gt;&lt;I&gt; The reason we choose 1 second interval for Bronze and Silver tables is to showcase this overlapping,&amp;nbsp; but do not shorten the trigger merely to force overlap. The success criterion is meeting the freshness SLO without sustained backlog or instability, not maximizing the number of concurrent batches.&lt;/I&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Monitor whether batch processing duration consistently exceeds the configured trigger interval.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Use pipeline metrics and logs to understand whether pipelining is active for individual queries.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Remember that task-level Spark parallelism, cross-table parallelism, and micro-batch pipelining are separate dimensions of concurrency.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Use pipelines.trigger.interval per table to match processing complexity&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;Triggered and Continuous modes solve different problems. Triggered mode makes sense for periodic or bursty workloads where latency requirements are relaxed and the pipeline can remain inactive between processing windows. Continuous mode is better suited to continuously arriving data and workloads that require consistently fresh results.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;But for Continuous workloads, Serverless Lakeflow Spark Declarative Pipelines introduce another important consideration: stream pipelining. Rather than following only the traditional sequential micro-batch execution pattern, eligible queries can overlap work across successive micro-batches, which eventually improves overall performance and throughput by using those idle CPU cycles.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In our benchmark, the Silver query averaged 2,242 ms per batch against a 1-second trigger interval. We observed overlap in 99.7% of Silver batch observations, including cases with three micro-batches in flight simultaneously improving the throughput by ~1.7X. The driver logs and micro-batch progress metrics provided direct evidence of that behavior.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The takeaway is not that Continuous mode is always better than Triggered mode. &lt;/STRONG&gt;&lt;SPAN&gt;The right mode depends on the workload. But when Continuous processing is the right architectural choice, Serverless SDP's stream pipelining can provide an additional execution advantage—helping eligible streaming queries overlap micro-batch work and use available compute more effectively when processing pressure exceeds the configured trigger cadence.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Aug 2026 18:30:31 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/triggered-vs-continuous-mode-a-deep-dive-into-serverless/ba-p/164327</guid>
      <dc:creator>smunigati</dc:creator>
      <dc:date>2026-08-10T18:30:31Z</dc:date>
    </item>
    <item>
      <title>How to Build, Test, and Ship SQL Pipelines on Databricks</title>
      <link>https://community.databricks.com/t5/technical-blog/how-to-build-test-and-ship-sql-pipelines-on-databricks/ba-p/164517</link>
      <description>&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Spark Declarative Pipelines (SDP) give SQL developers a first-class ETL experience. It is purpose-built for SQL, and it handles batch as well as streaming.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;There is now a full dev loop for SQL pipelines: you can either author in the new Databricks pipelines editor or from your local IDE, validate with a dry run, and ship seamlessly from dev to prod environments with Declarative Automation Bundles (DABs).&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Data quality and modular, environment-portable pipelines are built in. Expectations give you the row-level checks dbt users reach for, and SQL parameters let one pipeline run cleanly across dev, staging, and production.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 10 Aug 2026 17:35:00 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/how-to-build-test-and-ship-sql-pipelines-on-databricks/ba-p/164517</guid>
      <dc:creator>matthew_m</dc:creator>
      <dc:date>2026-08-10T17:35:00Z</dc:date>
    </item>
    <item>
      <title>Building a Production LangGraph Agent on Databricks - NorthStar Brand Copilot</title>
      <link>https://community.databricks.com/t5/technical-blog/building-a-production-langgraph-agent-on-databricks-northstar/ba-p/162634</link>
      <description>&lt;P&gt;&lt;SPAN&gt;We built &lt;/SPAN&gt;&lt;STRONG&gt;NorthStar Brand Copilot&lt;/STRONG&gt;&lt;SPAN&gt;, an AI assistant for brand managers and field-sales reps at a fictional multi-category CPG company (Snacks, Beverages, Personal Care). It's a &lt;/SPAN&gt;&lt;STRONG&gt;LangGraph custom agent&lt;/STRONG&gt;&lt;SPAN&gt; that routes each question to the right &lt;/SPAN&gt;&lt;STRONG&gt;Databricks-native&lt;/STRONG&gt;&lt;SPAN&gt; capability:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Genie&lt;/STRONG&gt;&lt;SPAN&gt; (NatualLanguage→SQL) for the numbers — sell-in/sell-out, trade-promotion ROI, inventory, market share&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;AI Search&lt;/STRONG&gt;(&lt;SPAN&gt;RAG) for the documents — product specs, allergens, consumer reviews, brand guidelines, the promo playbook&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Lakebase&lt;/STRONG&gt;&lt;SPAN&gt; (long-term memory) for the decisions, For ex: "remember we cut BOGO (Buy One Get One) at Walgreens," recalled across sessions. This provides a persistent, semantic context layer, ensuring the agent doesn't process queries in isolation but evolves its understanding based on past decisions and specific user history.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;LangGraph&lt;/STRONG&gt;&lt;SPAN&gt; for agent orchestration. While simpler frameworks (like standard LangChain chains or monolithic agent patterns) are easier to start with, LangGraph was chosen for its superior ability to handle cyclical, complex workflows and granular state management. It allows the agent to reason, refine its tool-calling strategy iteratively, and maintain persistent state, which is essential for enterprise-grade reliability compared to more rigid, linear alternatives.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: The CPG organization and data used in this blog post are fictional and intended for&amp;nbsp;&lt;/SPAN&gt;&lt;/I&gt;&lt;I&gt;&lt;SPAN&gt;demonstration purposes only.&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SashankKotta_0-1785652864446.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29672i2445C22B1BE89A55/image-size/large?v=v2&amp;amp;px=999" role="button" title="SashankKotta_0-1785652864446.png" alt="SashankKotta_0-1785652864446.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Aug 2026 11:43:09 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/building-a-production-langgraph-agent-on-databricks-northstar/ba-p/162634</guid>
      <dc:creator>SashankKotta</dc:creator>
      <dc:date>2026-08-10T11:43:09Z</dc:date>
    </item>
    <item>
      <title>Building Custom Apps on Lakehouse</title>
      <link>https://community.databricks.com/t5/technical-blog/building-custom-apps-on-lakehouse/ba-p/164990</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CarlosDC_0-1784920781574.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29442i16C8EC66190FCFCF/image-size/medium?v=v2&amp;amp;px=400" role="button" title="CarlosDC_0-1784920781574.png" alt="CarlosDC_0-1784920781574.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Aug 2026 20:21:53 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/building-custom-apps-on-lakehouse/ba-p/164990</guid>
      <dc:creator>CarlosDC</dc:creator>
      <dc:date>2026-08-07T20:21:53Z</dc:date>
    </item>
    <item>
      <title>Plug &amp; Play: Zerobus Ingest Now Supports Apache Kafka® Compatible APIs (Beta)</title>
      <link>https://community.databricks.com/t5/technical-blog/plug-amp-play-zerobus-ingest-now-supports-apache-kafka/ba-p/165102</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Learn how to use your existing Apache Kafka producer clients to ingest data directly into your Delta lakehouse with new beta support for Kafka-compatible APIs.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Aug 2026 17:03:34 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/plug-amp-play-zerobus-ingest-now-supports-apache-kafka/ba-p/165102</guid>
      <dc:creator>Vicky_Bukta_DB</dc:creator>
      <dc:date>2026-08-07T17:03:34Z</dc:date>
    </item>
    <item>
      <title>Load Testing Databricks SQL Warehouses with JMeter — Part 3: Running and Analyzing Results</title>
      <link>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-3/ba-p/164554</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="part3_figure6.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29633iBB01F816E94F0AAA/image-size/large?v=v2&amp;amp;px=999" role="button" title="part3_figure6.png" alt="part3_figure6.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;</description>
      <pubDate>Wed, 05 Aug 2026 11:24:28 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-3/ba-p/164554</guid>
      <dc:creator>DineshBabuK</dc:creator>
      <dc:date>2026-08-05T11:24:28Z</dc:date>
    </item>
    <item>
      <title>Load Testing Databricks SQL Warehouses with JMeter — Part 2: Concurrency and the Test Plan</title>
      <link>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-2/ba-p/164542</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="part2_figure3.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29629i1BAC3B50238B56E5/image-size/large?v=v2&amp;amp;px=999" role="button" title="part2_figure3.png" alt="part2_figure3.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;</description>
      <pubDate>Wed, 05 Aug 2026 11:22:49 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-2/ba-p/164542</guid>
      <dc:creator>DineshBabuK</dc:creator>
      <dc:date>2026-08-05T11:22:49Z</dc:date>
    </item>
    <item>
      <title>Load Testing Databricks SQL Warehouses with JMeter — Part 1: Inputs and Configuration</title>
      <link>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-1-inputs/ba-p/164534</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="part1_image1_fixed.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29626i0ED884A9CF2AB128/image-size/large?v=v2&amp;amp;px=999" role="button" title="part1_image1_fixed.png" alt="part1_image1_fixed.png" /&gt;&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 05 Aug 2026 11:20:57 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-1-inputs/ba-p/164534</guid>
      <dc:creator>DineshBabuK</dc:creator>
      <dc:date>2026-08-05T11:20:57Z</dc:date>
    </item>
    <item>
      <title>[PARTNER BLOG] Evolving Metric Views: YAML, UI, Genie Code &amp; Materialization</title>
      <link>https://community.databricks.com/t5/technical-blog/partner-blog-evolving-metric-views-yaml-ui-genie-code-amp/ba-p/163769</link>
      <description>&lt;P class="PDq2pG_selectionAnchorContainer" data-end="1838" data-start="1735"&gt;&lt;STRONG data-end="1838" data-start="1735"&gt;What if creating governed business metrics no longer meant spending most of your time writing YAML?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-end="1932" data-start="1843"&gt;That's exactly the direction Databricks is moving with the evolution of &lt;STRONG data-end="1931" data-start="1915"&gt;Metric Views&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-end="2419" data-start="1937"&gt;In this article, I explore how Metric Views have progressed from &lt;STRONG data-end="2028" data-start="2002"&gt;YAML-based definitions&lt;/STRONG&gt; to a richer experience powered by the &lt;STRONG data-end="2086" data-start="2067"&gt;Metric Views UI&lt;/STRONG&gt;, &lt;STRONG data-end="2097" data-start="2088"&gt;Genie Code&lt;/STRONG&gt;, and &lt;STRONG data-end="2122" data-start="2103"&gt;Materialization&lt;/STRONG&gt;. Through practical examples, screenshots, and real observations, I demonstrate how these capabilities simplify metric development, maintain consistency between UI and YAML, accelerate creation with AI, and improve query performance using precomputed results.&lt;/P&gt;
&lt;P data-end="2578" data-start="2424"&gt;If you're interested in building a governed semantic layer in Databricks, I hope this walkthrough provides useful insights into these latest enhancements.&lt;/P&gt;</description>
      <pubDate>Wed, 05 Aug 2026 09:02:53 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/partner-blog-evolving-metric-views-yaml-ui-genie-code-amp/ba-p/163769</guid>
      <dc:creator>V_Chanakya_Raju</dc:creator>
      <dc:date>2026-08-05T09:02:53Z</dc:date>
    </item>
    <item>
      <title>Custom Visualizations in AI/BI Dashboards: Build a Pareto Chart with Vega-Lite</title>
      <link>https://community.databricks.com/t5/technical-blog/custom-visualizations-in-ai-bi-dashboards-build-a-pareto-chart/ba-p/163659</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Need a visualization your standard AI/BI dashboard widgets can't create? Databricks AI/BI custom visualizations let you use Vega-Lite to build highly tailored charts. Learn how to craft a dynamic Pareto analysis with automated sorting, dynamic labels, background shading and Genie-assisted code enhancements.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Aug 2026 19:50:51 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/custom-visualizations-in-ai-bi-dashboards-build-a-pareto-chart/ba-p/163659</guid>
      <dc:creator>pstyld</dc:creator>
      <dc:date>2026-08-03T19:50:51Z</dc:date>
    </item>
    <item>
      <title>Try the new Zerobus Rescue Column: Choose-Your-Own-Adventure Schema Management  (Beta)</title>
      <link>https://community.databricks.com/t5/technical-blog/try-the-new-zerobus-rescue-column-choose-your-own-adventure/ba-p/164413</link>
      <description>&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Choose your adventure: navigating data schemas" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29568i557D751367D3F1E9/image-size/large?v=v2&amp;amp;px=999" role="button" title="Gemini_Generated_Image_8qnkgv8qnkgv8qnk.png" alt="Gemini_Generated_Image_8qnkgv8qnkgv8qnk.png" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;It is Friday afternoon. An upstream team ships a harmless-looking change: they add a &lt;/SPAN&gt;&lt;SPAN&gt;region&lt;/SPAN&gt;&lt;SPAN&gt; field to the events your service already emits, and somewhere along the way, a sensor starts reporting temperature as &lt;/SPAN&gt;&lt;SPAN&gt;"72F"&lt;/SPAN&gt;&lt;SPAN&gt; instead of &lt;/SPAN&gt;&lt;SPAN&gt;72&lt;/SPAN&gt;&lt;SPAN&gt;. You did not write that producer. You do not control its release schedule. And yet by Monday, your ingestion is either dropping those records on the floor or flat-out stalling. Every data engineer has lived some version of this, and now has nightmares reliving this data disruption.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The fundamental question when designing these pipelines&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;is: “&lt;STRONG&gt;How&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&amp;nbsp;strict should ingestion be about the shape of your data?”&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Today, we are introducing the &lt;/SPAN&gt;&lt;A href="https://docs.databricks.com/aws/en/ingestion/zerobus-rescue-column" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Zerobus Rescue Column (Beta)&lt;/STRONG&gt;&lt;/A&gt;&lt;SPAN&gt;, offering a way to answer that question in a way that makes sense for your organization. This is a designated Variant type column used to “catch” any extra or schema-mismatched fields.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Two camps, one spectrum&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;I have heard both arguments, and honestly, both have merit.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;One camp says, &lt;/SPAN&gt;&lt;STRONG&gt;"I don't want to stream garbage into my lakehouse. Gate it. If a record doesn't meet my contract, fail the producer; it's their problem."&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The other camp says, &lt;/SPAN&gt;&lt;STRONG&gt;"Accept everything. I would rather capture a messy record now and clean it up later than lose it forever. I don’t control the producers, but I’m responsible for ensuring data lands."&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Most teams live somewhere on this &lt;/SPAN&gt;&lt;STRONG&gt;spectrum&lt;/STRONG&gt;&lt;SPAN&gt;, and where they sit changes based on how responsibilities are delegated across your organization. The design goal for Zerobus was never to pick a side for you. It was to let you choose and to make that choice a property of your table rather than the ingestion service, because we know you (as the data engineer) cannot change the political cards; they are simply dealt to you.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;The table is the contract&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Your Delta table schema is the contract.&lt;/STRONG&gt;&lt;SPAN&gt; Zerobus validates every incoming record against that contract, and you decide how strict or how accepting the contract is. Think of it as &lt;/SPAN&gt;&lt;STRONG&gt;a choose-your-own-adventure&lt;/STRONG&gt;&lt;SPAN&gt;. The same service can enforce a rigid schema, accept a flexible subset of columns, or catch everything that does not fit, depending entirely on how you define your table.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Zerobus Ingest holds three fundamental principles:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Zerobus gates the data.&lt;/STRONG&gt;&lt;SPAN&gt; It validates every record against the target table and rejects anything that does not fit. It never guesses, and it never silently drops a column. It fails fast and loud!&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;You define the contract.&lt;/STRONG&gt;&lt;SPAN&gt; Marking columns as required or nullable and adding a rescue column are how you decide what "fits."&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Zerobus never augments your table.&lt;/STRONG&gt;&lt;SPAN&gt; It does not add columns, change types, or evolve your schema to accommodate a record. You evolve what Zerobus accepts by evolving the table, not the other way around, making your table the data contract.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;That last principle is the one people underestimate: &lt;/SPAN&gt;&lt;STRONG&gt;Zerobus is predictable by design.&lt;/STRONG&gt;&lt;SPAN&gt; Its number one job is to land your data durably and predictably in the lakehouse. If it quietly reshaped your table every time a producer sent something unexpected, it would not be predictable for downstream consumers. Everything below is built on top of that guarantee.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Choose your own adventure: Schema edition&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Schema Management: One table, many producers" style="width: 818px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29567iE9B3A72C2A932E85/image-dimensions/818x460?v=v2" width="818" height="460" role="button" title="Vicky_Bukta_DB_0-1785344147290.png" alt="Vicky_Bukta_DB_0-1785344147290.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Scenario 1: Accept a subset (all columns optional)&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;Make every column nullable. Producers can send any subset of the columns, and anything they omit is written as &lt;/SPAN&gt;&lt;SPAN&gt;NULL&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;CREATE TABLE main.default.air_quality (
  device_name STRING,
  temp INT,
  humidity INT);&lt;/LI-CODE&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1", "temp": 22, "humidity": 55}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;is &lt;/SPAN&gt;&lt;STRONG&gt;accepted&lt;/STRONG&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;All columns present.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1"}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt; is &lt;/SPAN&gt;&lt;STRONG&gt;accepted&lt;/STRONG&gt;&lt;SPAN&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="2"&gt;&lt;SPAN&gt;temp&lt;/SPAN&gt;&lt;SPAN&gt; and &lt;/SPAN&gt;&lt;SPAN&gt;humidity&lt;/SPAN&gt;&lt;SPAN&gt; are nullable, so they are written as &lt;/SPAN&gt;&lt;SPAN&gt;NULL&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1", "temp": 22, "region": "us-west"}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt; is &lt;/SPAN&gt;&lt;STRONG&gt;rejected&lt;/STRONG&gt;&lt;SPAN&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="2"&gt;&lt;SPAN&gt;region&lt;/SPAN&gt;&lt;SPAN&gt; does not exist in the table.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;This is flexible about what you &lt;/SPAN&gt;&lt;I&gt;&lt;SPAN&gt;omit&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt;, but still strict about what you &lt;/SPAN&gt;&lt;I&gt;&lt;SPAN&gt;add&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Scenario 2: Enforce specific fields (the NOT NULL gate)&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;Mark columns &lt;/SPAN&gt;&lt;SPAN&gt;NOT NULL&lt;/SPAN&gt;&lt;SPAN&gt; to require them. Every record must supply those fields, or it is rejected. This is the &lt;/SPAN&gt;&lt;STRONG&gt;strict end&lt;/STRONG&gt;&lt;SPAN&gt; of the spectrum, and &lt;/SPAN&gt;&lt;SPAN&gt;NOT NULL&lt;/SPAN&gt;&lt;SPAN&gt; is your &lt;/SPAN&gt;&lt;STRONG&gt;gate&lt;/STRONG&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;CREATE TABLE main.default.air_quality (
  device_name STRING NOT NULL,
  temp INT NOT NULL,
  humidity INT);&lt;/LI-CODE&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1", "temp": 22, "humidity": 55}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt; is &lt;/SPAN&gt;&lt;STRONG&gt;accepted&lt;/STRONG&gt;&lt;SPAN&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="2"&gt;&lt;SPAN&gt;All required columns present.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1", "temp": 22}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt; is &lt;/SPAN&gt;&lt;STRONG&gt;accepted&lt;/STRONG&gt;&lt;SPAN&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="2"&gt;&lt;SPAN&gt;humidity&lt;/SPAN&gt;&lt;SPAN&gt; is nullable, so it is written as &lt;/SPAN&gt;&lt;SPAN&gt;NULL&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{"device_name": "sensor-1"}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt; is &lt;/SPAN&gt;&lt;STRONG&gt;rejected&lt;/STRONG&gt;&lt;SPAN&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="2"&gt;&lt;SPAN&gt;temp&lt;/SPAN&gt;&lt;SPAN&gt; is required and missing.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;This is the answer for the first camp. If you want to guarantee that garbage never lands, &lt;/SPAN&gt;&lt;SPAN&gt;NOT NULL&lt;/SPAN&gt;&lt;SPAN&gt; is the lever.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Scenario 3: Catch everything else (the rescue column)&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;Add a &lt;/SPAN&gt;&lt;STRONG&gt;VARIANT&lt;/STRONG&gt;&lt;STRONG&gt; rescue column&lt;/STRONG&gt;&lt;SPAN&gt; to capture the fields that do not fit, instead of rejecting the record. Fields that match the table are written to their own columns as usual; any extra or non-conforming fields are grouped into the rescue column as a JSON object. This is the &lt;/SPAN&gt;&lt;STRONG&gt;most accepting&lt;/STRONG&gt;&lt;SPAN&gt; end of the spectrum, with nothing lost to rejection.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This is the answer for the second camp. It is also the new capability we are introducing today.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Rescue to the rescue&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;Earlier this year, we &lt;/SPAN&gt;&lt;A href="https://community.databricks.com/t5/technical-blog/schema-free-data-ingestion-with-zerobus-and-variant-type/ba-p/148399" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;added Variant type support&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt; so you could ingest semi-structured JSON without pinning down every field in advance. &lt;/SPAN&gt;&lt;STRONG&gt;The rescue column is the natural extension of that work.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The distinction is one of intent:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Variant&lt;/STRONG&gt;&lt;SPAN&gt; is for when you &lt;/SPAN&gt;&lt;I&gt;&lt;SPAN&gt;expect&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt; semi-structured data and want to store it natively. You reach for it deliberately.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;The rescue column&lt;/STRONG&gt;&lt;SPAN&gt; is for when you &lt;/SPAN&gt;&lt;I&gt;&lt;SPAN&gt;have&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt; a schema you believe in, and you want a safety net for the strays.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;You can schematize less up front and still keep that insurance policy. Anything extra a producer sends lands in the rescue column instead of being lost, and you keep the durability guarantee that matters most.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Configuring a rescue column&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;There is no magic column name. You designate a column as the rescue column by giving it three properties:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;It &lt;/SPAN&gt;&lt;STRONG&gt;allows null values&lt;/STRONG&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;It uses the &lt;/SPAN&gt;&lt;STRONG&gt;VARIANT&lt;/STRONG&gt;&lt;STRONG&gt; type&lt;/STRONG&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;It has the &lt;/SPAN&gt;&lt;STRONG&gt;zerobus-rescue&lt;/STRONG&gt;&lt;STRONG&gt; tag&lt;/STRONG&gt;&lt;SPAN&gt; applied in Unity Catalog.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;SPAN&gt;What lands in the rescue column, and what doesn't&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;Zerobus routes each field in a record based on how it fits the table:&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH&gt;
&lt;P&gt;&lt;STRONG&gt;Field in the record&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH&gt;
&lt;P&gt;&lt;STRONG&gt;Outcome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Matches a column by &lt;/SPAN&gt;&lt;STRONG&gt;name and type&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Written to that column normally&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;STRONG&gt;Not present&lt;/STRONG&gt;&lt;SPAN&gt; in the table schema&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Captured in the rescue column&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Present in the schema, but the &lt;/SPAN&gt;&lt;STRONG&gt;value's type doesn't match&lt;/STRONG&gt;&lt;SPAN&gt; and the target column is nullable&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Captured in the rescue column&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;Here is the whole thing in one example. Consider a table where &lt;/SPAN&gt;&lt;STRONG&gt;rescue&lt;/STRONG&gt;&lt;SPAN&gt; is nullable, uses &lt;/SPAN&gt;&lt;STRONG&gt;VARIANT&lt;/STRONG&gt;&lt;SPAN&gt;, and carries the &lt;/SPAN&gt;&lt;STRONG&gt;zerobus-rescue&lt;/STRONG&gt;&lt;SPAN&gt; tag:&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;CREATE TABLE main.default.air_quality (
  device_name STRING NOT NULL,
  temp INT,
  humidity LONG,
  rescue VARIANT
);&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN&gt;Now ingest a record with both a type mismatch and an extra field:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;"device_name"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;"sensor-1"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;"temp"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;"72F"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;"humidity"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;87&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;"extra_field"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;"some value"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="andale mono,times" color="#008000"&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN&gt;The result:&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 15px;"&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH style="border: 1px solid #ccc; padding: 14px 12px; text-align: left; background-color: #f2f2f2; font-size: 14px; font-weight: bold;"&gt;device_name&lt;/TH&gt;
&lt;TH style="border: 1px solid #ccc; padding: 14px 12px; text-align: left; background-color: #f2f2f2; font-size: 14px; font-weight: bold;"&gt;temp&lt;/TH&gt;
&lt;TH style="border: 1px solid #ccc; padding: 14px 12px; text-align: left; background-color: #f2f2f2; font-size: 14px; font-weight: bold;"&gt;humidity&lt;/TH&gt;
&lt;TH style="border: 1px solid #ccc; padding: 14px 12px; text-align: left; background-color: #f2f2f2; font-size: 14px; font-weight: bold;"&gt;rescue&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="border: 1px solid #ccc; padding: 8px 12px;"&gt;sensor-1&lt;/TD&gt;
&lt;TD style="border: 1px solid #ccc; padding: 8px 12px;"&gt;null&lt;/TD&gt;
&lt;TD style="border: 1px solid #ccc; padding: 8px 12px;"&gt;87&lt;/TD&gt;
&lt;TD style="border: 1px solid #ccc; padding: 8px 12px;"&gt;{"extra_field": "some value", "temp": "72F"}&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;Both non-conforming fields, the mistyped &lt;/SPAN&gt;&lt;STRONG&gt;temp&lt;/STRONG&gt;&lt;SPAN&gt; and the unknown &lt;/SPAN&gt;&lt;STRONG&gt;extra_field&lt;/STRONG&gt;&lt;SPAN&gt;, are grouped into the rescue column's JSON object. That Friday-afternoon change from the opening? It lands cleanly, and you still have every byte to reconcile later.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Recommendations&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;A few things to keep in mind as you design tables around this:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Evolve the table, not the ingest.&lt;/STRONG&gt;&lt;SPAN&gt; Zerobus never auto-evolves your schema. When your data shape changes permanently, evolve the table first (for example, with &lt;/SPAN&gt;&lt;STRONG&gt;ALTER TABLE&lt;/STRONG&gt;&lt;SPAN&gt;), then send records against the new schema.&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Keep your schema backward compatible. &lt;/STRONG&gt;&lt;SPAN&gt;Adding a nullable column is non-breaking, so you can roll out table and producer changes on separate timelines.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;The rescue column is a landing zone, not a destination.&lt;/STRONG&gt;&lt;SPAN&gt; Once data is durable, you can transform and schematize it downstream. A common pattern is to &lt;/SPAN&gt;&lt;STRONG&gt;fan out&lt;/STRONG&gt;&lt;SPAN&gt;: read the rescue column, promote fields that have become common into real typed columns, and route the rest onward. The rescue column buys you time to make those decisions with the data safely in hand.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Combine strictness with rescue deliberately. NOT NULL&lt;/STRONG&gt;&lt;SPAN&gt; on the fields you truly require, plus a rescue column for everything else, gives you a table that both &lt;/SPAN&gt;&lt;STRONG&gt;guarantees&lt;/STRONG&gt;&lt;SPAN&gt; your core contract and &lt;/SPAN&gt;&lt;STRONG&gt;never loses&lt;/STRONG&gt;&lt;SPAN&gt; the extras. That combination is where most teams end up.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN&gt;Try it out today&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;Our whole philosophy is the following: &lt;/SPAN&gt;&lt;STRONG&gt;Zerobus makes your data durable and is reliable when it comes to landing your data. You decide how much to schematize along the way.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Your adventure, your rules.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Ready to try it? Check out the &lt;/SPAN&gt;&lt;A href="https://docs.databricks.com/aws/en/ingestion/zerobus-rescue-column" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;Zerobus rescue column documentation&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt; to design your contract.&amp;nbsp;Be sure to &lt;A href="https://docs.databricks.com/aws/en/admin/workspace-settings/manage-previews" target="_self"&gt;enable the Beta feature&lt;/A&gt;&amp;nbsp;first.&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN&gt;Have questions, or want to share how you are shaping your schemas with Zerobus? Join the discussion below!&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jul 2026 21:11:44 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/try-the-new-zerobus-rescue-column-choose-your-own-adventure/ba-p/164413</guid>
      <dc:creator>Vicky_Bukta_DB</dc:creator>
      <dc:date>2026-07-29T21:11:44Z</dc:date>
    </item>
    <item>
      <title>From Experiment to Prod: LakeFlow Spark Declarative Pipelines Testing Blueprint</title>
      <link>https://community.databricks.com/t5/technical-blog/from-experiment-to-prod-lakeflow-spark-declarative-pipelines/ba-p/164292</link>
      <description>&lt;P&gt;Part 2 of the testing blueprint: how to test SDP pipelines end-to-end. Decouple your logic for fast unit tests, then use pytest, the Databricks SDK, and Databricks Connect to run the real pipeline against ephemeral, isolated Unity Catalog schemas, all from your IDE or test notebook.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jul 2026 15:29:51 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/from-experiment-to-prod-lakeflow-spark-declarative-pipelines/ba-p/164292</guid>
      <dc:creator>Taras_Chaikovsk</dc:creator>
      <dc:date>2026-07-28T15:29:51Z</dc:date>
    </item>
    <item>
      <title>Serve Tableau Reports Directly from Databricks SQL</title>
      <link>https://community.databricks.com/t5/technical-blog/serve-tableau-reports-directly-from-databricks-sql/ba-p/164139</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Connect Tableau to Databricks SQL to eliminate data warehouse sync pipelines, cut compute costs, and serve dashboards directly from your Lakehouse.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jul 2026 13:29:14 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/serve-tableau-reports-directly-from-databricks-sql/ba-p/164139</guid>
      <dc:creator>SepidehHashemi</dc:creator>
      <dc:date>2026-07-28T13:29:14Z</dc:date>
    </item>
    <item>
      <title>[CUSTOMER BLOG] How S&amp;P Global Energy Made Its Structured Data Estate Conversational with Databricks</title>
      <link>https://community.databricks.com/t5/technical-blog/customer-blog-how-s-amp-p-global-energy-made-its-structured-data/ba-p/163546</link>
      <description>&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;From Data to Dialogue: How S&amp;amp;P Global Energy Made Its Structured Data Estate Conversational with Databricks Genie Agents and MCP&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-ccp-props="{&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:120}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;I&gt;&lt;SPAN data-contrast="none"&gt;S&amp;amp;P Global Energy × Databricks — Customer Success Story&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN data-ccp-props="{&amp;quot;335551550&amp;quot;:2,&amp;quot;335551620&amp;quot;:2,&amp;quot;335559739&amp;quot;:320}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="1"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;If you have ever tried to make a large, complex structured data estate available to AI agents and assistants, you have likely run into the same wall we did: agents are only as good as the context they can reach, and enterprise data rarely lives in one neat, well-documented place.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;At S&amp;amp;P Global Energy, our data spans&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;Chemicals, Crude Oil, Refined Products,&amp;nbsp;Gas &amp;amp; Power,&amp;nbsp;&amp;nbsp;Liquified Natural Gas (LNG)&amp;nbsp;and more&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="none"&gt;— and each commodity is itself a rich family of datasets. LNG alone includes&amp;nbsp;facility specifications,&amp;nbsp;cargos&amp;nbsp;,&amp;nbsp;outages, supply and demand fundamentals, netbacks, historical and forecast prices,&amp;nbsp;and contracts. Chemicals&amp;nbsp;spans&amp;nbsp;capacity, production,&amp;nbsp;utilization, trade, demand by end use and by derivative, inventory change, and country- and region-level supply–demand balances. Our other commodities follow the&amp;nbsp;similar&amp;nbsp;patterns. This data lives across Databricks and several non-Databricks sources.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Jul 2026 15:26:44 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/customer-blog-how-s-amp-p-global-energy-made-its-structured-data/ba-p/163546</guid>
      <dc:creator>debaprasad</dc:creator>
      <dc:date>2026-07-27T15:26:44Z</dc:date>
    </item>
    <item>
      <title>When Milliseconds Matter: Databricks Powers the Next Generation of Operational Workloads</title>
      <link>https://community.databricks.com/t5/technical-blog/when-milliseconds-matter-databricks-powers-the-next-generation/ba-p/160921</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Databricks redefined real-time data processing with Real-Time Mode (RTM) in Spark Structured Streaming, hitting sub-300ms P99 latency for mission-critical operational workloads. Lakeflow Spark Declarative Pipelines let both pro-coders and SQL/Python developers build production streaming pipelines. The DAIS 2026 additions go further: Lakehouse//RT serves real-time queries on governed data, and Lakebase (LTAP) underpins AI agents. Together they close the loop from a millisecond shop-floor decision to coordinated, company-wide action, with no separate serving stack and no copies of data.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In this article, we discover how Databricks’ Real-Time Mode and Spark Declarative Pipelines are transforming real-time data processing in the manufacturing industry, enabling ultra-low latency for operational workloads and unifying batch and streaming analytics for AI-driven enterprises.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Jul 2026 13:58:07 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/when-milliseconds-matter-databricks-powers-the-next-generation/ba-p/160921</guid>
      <dc:creator>rosinaKazakova</dc:creator>
      <dc:date>2026-07-27T13:58:07Z</dc:date>
    </item>
  </channel>
</rss>

