<?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>All Technical Blog posts</title>
    <link>https://community.databricks.com/t5/technical-blog/bg-p/technical-blog</link>
    <description>All Technical Blog posts</description>
    <pubDate>Mon, 24 Aug 2026 10:53:02 GMT</pubDate>
    <dc:creator>technical-blog</dc:creator>
    <dc:date>2026-08-24T10:53:02Z</dc:date>
    <item>
      <title>Re: 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/bc-p/166277#M1184</link>
      <description>&lt;P&gt;Nice to hear it is a known issue and being worked on!&lt;/P&gt;</description>
      <pubDate>Mon, 24 Aug 2026 07:32:59 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166277#M1184</guid>
      <dc:creator>-werners-</dc:creator>
      <dc:date>2026-08-24T07:32:59Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/166190#M1183</link>
      <description>&lt;P&gt;Thanks &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/14792"&gt;@-werners-&lt;/a&gt;, glad the guide helped.&lt;/P&gt;
&lt;P&gt;Your question is a bit outside what the blog covers. What you are seeing is a different thing: how the direct engine compares the values your cluster policy fills in each time you plan or deploy.&lt;/P&gt;
&lt;P&gt;It's a known issue and it is being worked on. A recent CLI fix made the engine leave apply_policy_default_values, data_security_mode, enable_elastic_disk, node_type_id and a few others alone, which is why you see those skipped. The ones you listed, spark_conf, spark_version, spark_env_vars, runtime_engine and custom_tags, are not handled yet, so they still show up as an update every time.&lt;/P&gt;
&lt;P&gt;A quick workaround is to set those fields yourself in the bundle YAML. Then your config matches what the policy adds and the diff goes away. You lose a little of the benefit of the policy, but it stops the constant changes until the engine catches up.&lt;/P&gt;</description>
      <pubDate>Fri, 21 Aug 2026 21:01:06 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166190#M1183</guid>
      <dc:creator>himanshu_ranjan</dc:creator>
      <dc:date>2026-08-21T21:01:06Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/166121#M1179</link>
      <description>&lt;P&gt;Tnx, helpful guide!&lt;BR /&gt;&lt;BR /&gt;However I do notice that the direct engine still lacks some functionality.&lt;BR /&gt;fetching values from cluster policies apparently is only partially implemented.&lt;BR /&gt;I had Genie make me a nice summary :-):&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Summary:&lt;/STRONG&gt; After migrating from the Terraform engine to the direct engine, jobs with apply_policy_default_values: true are flagged as "changed" on every bundle plan / bundle deploy, even when no YAML changes were made. This creates an infinite update loop because the cluster policy re-injects the same values after each deploy.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Current behavior:&lt;/STRONG&gt; The direct engine correctly skips some policy/platform-populated fields:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;azure_attributes → "action": "skip", "reason": "managed"&lt;/LI&gt;&lt;LI&gt;data_security_mode → "action": "skip", "reason": "backend_default"&lt;/LI&gt;&lt;LI&gt;enable_elastic_disk → "action": "skip", "reason": "backend_default"&lt;/LI&gt;&lt;LI&gt;node_type_id → "action": "skip", "reason": "backend_default"&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;But it flags these policy-injected fields as "action": "update":&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;spark_env_vars&lt;/LI&gt;&lt;LI&gt;spark_version&lt;/LI&gt;&lt;LI&gt;spark_conf&lt;/LI&gt;&lt;LI&gt;custom_tags (e.g. ResourceClass: SingleNode)&lt;/LI&gt;&lt;LI&gt;runtime_engine&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;Expected behavior:&lt;/STRONG&gt; When apply_policy_default_values: true is set on a job cluster, the engine should recognize that the policy is the source of truth for fields not declared in the bundle YAML. Fields present in remote state but absent from local config — that are injected by the referenced policy_id — should be treated as "action": "skip", "reason": "managed" (or a new reason like "policy_default"), not as removals.&lt;/P&gt;</description>
      <pubDate>Fri, 21 Aug 2026 08:47:24 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166121#M1179</guid>
      <dc:creator>-werners-</dc:creator>
      <dc:date>2026-08-21T08:47:24Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/166098#M1178</link>
      <description>&lt;P&gt;Great post, I wasn't aware of the change and helps me learn about it. Will greatly benefit one of my customers!&lt;/P&gt;</description>
      <pubDate>Fri, 21 Aug 2026 02:20:21 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166098#M1178</guid>
      <dc:creator>EduardoLomonaco</dc:creator>
      <dc:date>2026-08-21T02:20:21Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/166085#M1177</link>
      <description>&lt;P&gt;Thanks &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/235827"&gt;@Armanillo_RoK&lt;/a&gt;&amp;nbsp;for reading it closely, and glad it was useful. You've read the decoupling correctly: because the direct engine no longer waits on a Terraform provider release, the set of bundle-supported resources can grow on its own, and it now reaches infrastructure-shaped objects like catalogs and external locations.&lt;/P&gt;
&lt;P&gt;On which layer owns what, there's actually a stated recommendation, not just "wherever ships first." The Databricks deployment guide (the IaC section) suggests Terraform for infrastructure like workspaces, networking, Unity Catalog and storage, and Bundles for data and AI workloads, where it lists jobs, pipelines, notebooks and models:&lt;BR /&gt;&lt;A href="https://docs.databricks.com/aws/en/lakehouse-architecture/deployment-guide/iac" target="_blank"&gt;https://docs.databricks.com/aws/en/lakehouse-architecture/deployment-guide/iac&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Being able to deploy catalogs and external locations from a bundle is a new capability, but it doesn't move that recommendation. By default those still sit with the platform team's Terraform. I'd only manage one from a bundle as a deliberate, agreed exception. For example, a self-contained catalog that belongs to a single workload, where the platform team has decided to leave it to that team instead of managing it centrally.&lt;/P&gt;
&lt;P&gt;On Genie, I'd keep it in the bundle, for the reason you gave. A Genie space isn't really infrastructure, it's instructions, sample questions and trusted assets that move with the data model, so it belongs next to the pipelines it describes. Terraform provider support for Genie is an open feature request, not something available today, and even if it lands I'd let ownership decide rather than the fact that a new resource exists. A Genie space tied to a data product stays in the bundle.&lt;/P&gt;
&lt;P&gt;On two tools managing the same object, there isn't a cross-tool safeguard. Bundles on the direct engine keep their own deployment state and Terraform keeps its own state file, and neither one knows about the other, so each can think it's authoritative. bundle deployment bind and Terraform's import are explicit ways to adopt an existing resource, not conflict detectors. So the real guardrail is ownership: one authoritative tool per object, usually split by team, with the platform team owning the Terraform repo and the data engineers owning the bundle, and the bundle referencing infra objects by name instead of redeclaring them. When you do move ownership between the two, do it deliberately and check with a plan that shows no unintended create, replace or delete. That's why I lean on bundle plan as the safe preview in the post.&lt;/P&gt;</description>
      <pubDate>Thu, 20 Aug 2026 17:40:22 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166085#M1177</guid>
      <dc:creator>himanshu_ranjan</dc:creator>
      <dc:date>2026-08-20T17:40:22Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/166064#M1176</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/228703"&gt;@himanshu_ranjan&lt;/a&gt;,&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;thanks for the heads-up!&lt;/P&gt;&lt;P&gt;Genie Agents (still genie_spaces as a bundle resource type) landed in bundles because the Terraform provider has no equivalent resource, and the direct engine removed the requirement to wait for a provider release. Fair enough.&lt;/P&gt;&lt;P&gt;But that decoupling means the set of bundle-deployable resources will now grow faster than the provider's, and it has already reached infrastructure-shaped objects, namely catalogs and external locations are direct-engine bundle resources today, and those sit squarely in most platform teams' Terraform.&lt;/P&gt;&lt;P&gt;So is there a stated principle for which layer owns what going forward, or does it land wherever ships first?&lt;/P&gt;&lt;P&gt;Specifically, if the provider eventually adds a Genie resource, is the guidance to move or to stay in bundles? My own view is stay in DABs since a Genie Agent isn't really infrastructure, it's instructions, example queries and trusted assets that change with the data model, so it belongs next to the pipelines it describes. But I'd rather know if that's the intended direction.&lt;/P&gt;&lt;P&gt;And for a resource both layers can manage, is there anything preventing two tools from claiming the same object, or is that purely down to team discipline?&lt;/P&gt;</description>
      <pubDate>Thu, 20 Aug 2026 13:22:11 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/dabs-migration-guide-terraform-to-the-direct-deployment-engine/bc-p/166064#M1176</guid>
      <dc:creator>Armanillo_RoK</dc:creator>
      <dc:date>2026-08-20T13:22:11Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/165968#M1175</link>
      <description>&lt;P&gt;Great article, very useful indeed.&lt;/P&gt;</description>
      <pubDate>Wed, 19 Aug 2026 09:51:57 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/load-testing-databricks-sql-warehouses-with-jmeter-part-1-inputs/bc-p/165968#M1175</guid>
      <dc:creator>yit337</dc:creator>
      <dc:date>2026-08-19T09:51:57Z</dc:date>
    </item>
    <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>Re: 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/bc-p/165577#M1172</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/125801"&gt;@DoTA&lt;/a&gt;&amp;nbsp;- Great input on the Serverless Budget Policy. I recommend checking out this doc for a reference on how to manage budgets and cost controls for Genie:&amp;nbsp;&lt;A href="https://docs.databricks.com/aws/en/genie/budgets" target="_blank"&gt;https://docs.databricks.com/aws/en/genie/budgets&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Additionally, step 9 covers UC permissions and policies review, which is super important indeed.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 20:52:34 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/migrate-your-dashboards-to-ai-bi-with-genie-code/bc-p/165577#M1172</guid>
      <dc:creator>pedrozanlorensi</dc:creator>
      <dc:date>2026-08-12T20:52:34Z</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>Re: 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/bc-p/165512#M1171</link>
      <description>&lt;P&gt;Solid benchmark — the stream pipelining section is particularly valuable since that behavior isn't obvious from the docs alone and most teams wouldn't think to grep driver logs to confirm it.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;One dimension worth adding to the decision table: the cost break-even point. The table notes that triggered mode "avoids unnecessary active execution cost during idle periods," which is correct — but the comparison isn't symmetric. Continuous mode pays for steady-state compute even when no data is arriving; triggered mode pays startup overhead (153–194 seconds per invocation in your benchmark) on every cycle regardless of data volume.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The math shifts with arrival rate. At low throughput (sparse events, long quiet windows), triggered on a 5-minute schedule means startup overhead is a fixed tax on a small data payload, but the pipeline is idle 70%+ of the time — triggered wins on cost. At high continuous throughput, continuous mode's steady-state efficiency closes the cost gap quickly, especially once stream pipelining kicks in and utilizes those otherwise-idle CPU cycles.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;A hybrid pattern that works well in practice: Bronze/Silver on continuous to meet the freshness SLO, Gold/reporting layers on triggered at 15–30 minute intervals. Gold is typically aggregation-heavy and latency-tolerant — no user is waiting sub-minute for a daily revenue roll-up. You preserve the freshness guarantee where it matters and avoid paying continuous compute hours on your widest, most expensive tables.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The pipelines.trigger.interval per-table config you mention at the end enables exactly this within a single pipeline — worth calling out explicitly as the primary lever for this hybrid approach.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 14:40:30 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/triggered-vs-continuous-mode-a-deep-dive-into-serverless/bc-p/165512#M1171</guid>
      <dc:creator>DoTA</dc:creator>
      <dc:date>2026-08-12T14:40:30Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/165511#M1170</link>
      <description>&lt;P&gt;Great end-to-end write-up — the MLflow tracing setup in particular is a pattern more teams should adopt from day one rather than bolting on later.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;One thing worth extending that tracing to: per-node cost attribution. Since every ChatDatabricks call in the LangGraph graph is a separate model invocation, the context window grows with each tool result appended to the message list. In a session where the agent calls Genie + Vector Search + Lakebase in sequence, you're often paying 3–5× what a single-query baseline would suggest — because each tool output accumulates in the prompt for all subsequent steps.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;MLflow spans already capture token counts per step. Adding a cost_usd attribute to each span (input_tokens * price_in + output_tokens * price_out) and grouping by session_id gives you a per-conversation cost view that's essential for tuning buffer sizes before you hit production scale.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Two optimizations that help: (1) Summarize each tool response before appending it to the graph state — passing a 50-token summary instead of a 500-token raw Genie result keeps context lean across subsequent nodes. (2) Not all nodes need Sonnet-class reasoning. The routing step (which tool to call?) is usually a simpler classification task than the final answer synthesis. Splitting that to a lighter model and reserving claude-sonnet-4-5 for the final generation step can cut per-session cost 30–50% with no visible quality regression on the routing decision itself.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 14:38:43 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/building-a-production-langgraph-agent-on-databricks-northstar/bc-p/165511#M1170</guid>
      <dc:creator>DoTA</dc:creator>
      <dc:date>2026-08-12T14:38:43Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/165510#M1169</link>
      <description>&lt;P&gt;Great structured playbook — the 10-step framing makes this approachable for teams that are intimidated by "migration" as a project.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;One thing worth calling out for larger migrations: the serverless compute Genie Code spins up during /importBI runs is billed under your workspace's serverless budget, not tied to a specific project or cost center by default. If you're migrating 30+ dashboards in parallel across multiple teams, that attribution gap adds up fast and can surprise finance at month-end.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;A practical guardrail before starting: set a serverless budget policy scoped by tag or user group, so you get early signals on spend per migration workstream rather than discovering it after the fact.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;On the Unity Catalog promotion step (step 7) — for teams in regulated industries (banking, healthcare), this is also where a PII scan of migrated metric views pays off. Genie Code faithfully migrates computed columns and filters, but it won't flag if a measure accidentally surfaces personal data that was previously hidden by row-level security in the original BI layer. Worth a data governance review pass before broad publication, especially if your Unity Catalog has mixed sensitivity tiers.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Aug 2026 14:35:34 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/migrate-your-dashboards-to-ai-bi-with-genie-code/bc-p/165510#M1169</guid>
      <dc:creator>DoTA</dc:creator>
      <dc:date>2026-08-12T14:35:34Z</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>Re: 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/bc-p/165383#M1166</link>
      <description>&lt;P class="wnfdntu _1ibi0s3f5 _1ibi0s3ce _1ibi0s3ea"&gt;Great question &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/164109"&gt;@hschimanski&lt;/a&gt;&lt;BR /&gt;&lt;BR /&gt;Here is the doc for it:&amp;nbsp;&lt;A href="https://docs.databricks.com/aws/en/dashboards/manage/visualizations/custom-visualizations#filter-other-widgets-on-selection" target="_blank" rel="noopener"&gt;Filter other widgets on selection.&lt;/A&gt;&lt;/P&gt;
&lt;P class="wnfdntu _1ibi0s3f5 _1ibi0s3ce _1ibi0s3ea"&gt;There are some requirements listed in the doc. Here is the &lt;STRONG&gt;updated vega lite spec from this blog&lt;/STRONG&gt; that uses &lt;STRONG&gt;cross filtering&lt;/STRONG&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A few key points:&lt;/P&gt;
&lt;UL&gt;
&lt;LI class="css-1ksqbpg"&gt;&lt;SPAN class="du-bois-light-typography css-dulbl6"&gt;params&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;goes inside the &lt;STRONG&gt;layer with the clickable mark&lt;/STRONG&gt;, not at the root of the layered spec&lt;/LI&gt;
&lt;LI class="css-1ksqbpg"&gt;&lt;SPAN class="du-bois-light-typography css-dulbl6"&gt;fields&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;must reference the &lt;STRONG&gt;field names from your widget's Fields config&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI class="css-1ksqbpg"&gt;Only &lt;STRONG&gt;dimension fields&lt;/STRONG&gt; work (not aggregated measures)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;To test it, try this.&lt;/STRONG&gt; &lt;BR /&gt;1. Create a new &lt;STRONG&gt;bar chart widget&lt;/STRONG&gt;&amp;nbsp;(or any widget you want) that uses the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;X axis - &lt;STRONG&gt;defect_category&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Y axis - &lt;STRONG&gt;SUM(defect_count)&lt;BR /&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;2.&amp;nbsp;Then update the &lt;STRONG&gt;vega lite in the custom viz&lt;/STRONG&gt; with this:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;LI-CODE lang="markup"&gt;{
  "$schema": "https://vega.github.io/schema/vega-lite/v6.json",
  "width": "container",
  "height": "container",
  "data": {
    "name": "databricks_query"
  },
  "encoding": {
    "x": {
      "field": "defect_category",
      "type": "nominal",
      "sort": {
        "op": "min",
        "field": "sort_order",
        "order": "ascending"
      },
      "axis": {
        "title": "Defect category",
        "labelAngle": -40
      }
    }
  },
  "layer": [
    {
      "transform": [
        {
          "filter": "datum.pareto_group === 'Key Issue Drivers'"
        }
      ],
      "mark": {
        "type": "rect",
        "color": "#FF5F46",
        "opacity": 0.15
      }
    },
    {
      "params": [
        {
          "name": "databricks_mark_selection",
          "select": {
            "type": "point",
            "fields": [
              "defect_category"
            ]
          }
        }
      ],
      "mark": {
        "type": "bar",
        "width": {
          "band": 0.8
        },
        "stroke": null
      },
      "encoding": {
        "y": {
          "field": "defect_count",
          "type": "quantitative",
          "axis": {
            "title": "Defect count"
          }
        },
        "color": {
          "field": "pareto_group",
          "type": "nominal",
          "scale": {
            "domain": [
              "Key Issue Drivers",
              "Minor Issues",
              "Cumulative %"
            ],
            "range": [
              "#FF5F46",
              "#C4CCD6",
              "#1B5162"
            ]
          },
          "legend": {
            "title": null,
            "orient": "top"
          }
        },
        "fillOpacity": {
          "condition": {
            "param": "databricks_mark_selection",
            "value": 1
          },
          "value": 0.4
        },
        "stroke": {
          "condition": {
            "param": "databricks_mark_selection",
            "empty": false,
            "value": {
              "expr": "colors.markHighlightColor"
            }
          },
          "value": null
        },
        "strokeWidth": {
          "condition": {
            "param": "databricks_mark_selection",
            "empty": false,
            "value": 2
          },
          "value": 0
        }
      }
    },
    {
      "layer": [
        {
          "mark": {
            "type": "area",
            "color": "#1B5162",
            "opacity": 0.05,
            "line": false
          },
          "encoding": {
            "y": {
              "field": "cumulative_percent",
              "type": "quantitative",
              "axis": {
                "title": "Cumulative %",
                "orient": "right"
              }
            }
          }
        },
        {
          "mark": {
            "type": "line",
            "point": {
              "size": 80,
              "filled": true
            }
          },
          "encoding": {
            "y": {
              "field": "cumulative_percent",
              "type": "quantitative"
            },
            "color": {
              "datum": "Cumulative %",
              "type": "nominal"
            }
          }
        },
        {
          "transform": [
            {
              "calculate": "round(datum.cumulative_percent) + '%'",
              "as": "cum_label"
            }
          ],
          "mark": {
            "type": "text",
            "dy": -12,
            "fontSize": 12,
            "fontWeight": "bold",
            "color": "#1B5162"
          },
          "encoding": {
            "y": {
              "field": "cumulative_percent",
              "type": "quantitative"
            },
            "text": {
              "field": "cum_label",
              "type": "nominal"
            }
          }
        },
        {
          "mark": {
            "type": "rule",
            "color": "#0b2026",
            "strokeDash": [
              6,
              4
            ],
            "size": 2
          },
          "encoding": {
            "x": null,
            "y": {
              "datum": 80
            }
          }
        },
        {
          "transform": [
            {
              "filter": "datum.defect_category === 'Label Error'"
            }
          ],
          "mark": {
            "type": "text",
            "text": "80% of defects",
            "align": "center",
            "baseline": "bottom",
            "dy": -1,
            "fontSize": 13,
            "fontWeight": "bold",
            "color": "#0b2026"
          },
          "encoding": {
            "y": {
              "datum": 80
            }
          }
        },
        {
          "transform": [
            {
              "filter": "datum.pareto_group === 'Key Issue Drivers'"
            },
            {
              "joinaggregate": [
                {
                  "op": "max",
                  "field": "sort_order",
                  "as": "max_rank"
                }
              ]
            },
            {
              "filter": "datum.sort_order === round((1 + datum.max_rank) / 2)"
            }
          ],
          "mark": {
            "type": "text",
            "text": "Fix these first",
            "align": "center",
            "baseline": "middle",
            "fontSize": 15,
            "fontWeight": "bold",
            "color": "#98102A"
          },
          "encoding": {
            "y": {
              "datum": 92
            }
          }
        },
        {
          "transform": [
            {
              "calculate": "datum.pareto_group === 'Key Issue Drivers' ? 1 : 0",
              "as": "is_kd"
            },
            {
              "calculate": "datum.pareto_group === 'Key Issue Drivers' ? datum.cumulative_percent : 0",
              "as": "kd_cum_val"
            },
            {
              "joinaggregate": [
                {
                  "op": "count",
                  "as": "total_cats"
                },
                {
                  "op": "sum",
                  "field": "is_kd",
                  "as": "kd_count"
                },
                {
                  "op": "max",
                  "field": "kd_cum_val",
                  "as": "kd_cum"
                }
              ]
            },
            {
              "filter": "datum.sort_order === round(datum.total_cats * 0.7)"
            },
            {
              "calculate": "datum.kd_count + ' of ' + datum.total_cats + ' categories drive ' + round(datum.kd_cum) + '% of all defects'",
              "as": "summary"
            }
          ],
          "mark": {
            "type": "text",
            "align": "center",
            "baseline": "middle",
            "fontSize": 15,
            "fontWeight": "bold",
            "color": "#1B3139"
          },
          "encoding": {
            "y": {
              "datum": 55
            },
            "text": {
              "field": "summary",
              "type": "nominal"
            }
          }
        }
      ]
    }
  ],
  "resolve": {
    "scale": {
      "y": "independent"
    }
  },
  "config": {
    "autosize": {
      "type": "fit",
      "contains": "padding"
    }
  }
}&lt;/LI-CODE&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;STRONG&gt;Example&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="filtering.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/29903iCAFAAF5762D8B281/image-size/large?v=v2&amp;amp;px=999" role="button" title="filtering.png" alt="filtering.png" /&gt;&lt;/span&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P class="wnfdntu _1ibi0s3f5 _1ibi0s3ce _1ibi0s3ea"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 11 Aug 2026 14:12:38 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/custom-visualizations-in-ai-bi-dashboards-build-a-pareto-chart/bc-p/165383#M1166</guid>
      <dc:creator>pstyld</dc:creator>
      <dc:date>2026-08-11T14:12:38Z</dc:date>
    </item>
    <item>
      <title>Re: 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/bc-p/165279#M1163</link>
      <description>&lt;P&gt;Looks great. It really shows your deep knowledge of the system and the scenarios needed to validate it thoroughly!&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;it really helps us with better understanding of different modes! &amp;nbsp;TY&lt;/P&gt;</description>
      <pubDate>Mon, 10 Aug 2026 20:22:42 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/triggered-vs-continuous-mode-a-deep-dive-into-serverless/bc-p/165279#M1163</guid>
      <dc:creator>Shaker_R</dc:creator>
      <dc:date>2026-08-10T20:22:42Z</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>
  </channel>
</rss>

