<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Designing an Effective &amp;quot;Quarantine&amp;quot; Pattern for Failed DLT Expectations in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/designing-an-effective-quot-quarantine-quot-pattern-for-failed/m-p/168345#M55903</link>
    <description>&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Hi everyone,&lt;/P&gt;&lt;P&gt;I’m building out a production&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Medallion Architecture&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Delta Live Tables (DLT)&lt;/STRONG&gt;, and I’m refining our strategy for handling data that fails&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Expectations&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;While&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;expect_or_drop&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;expect_or_fail&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;are straightforward, I’m struggling to find the "Gold Standard" for a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Quarantine pattern&lt;/STRONG&gt;—where we capture the bad data for manual review without stopping the entire pipeline or losing the original lineage.&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Are you creating a separate "Invalid" DLT table for every Silver table, or have you found a way to centralize all "Expectation Failures" into a single governed view?&lt;/LI&gt;&lt;LI&gt;How do you handle the "re-processing" lifecycle? Once a data steward corrects the source data, what is your preferred method for re-injecting that record into the DLT flow without triggering a full refresh?&lt;/LI&gt;&lt;LI&gt;Have you found that too many "Expectations" significantly impact the performance of DLT at the petabyte scale, or is the overhead negligible?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;I’d love to see how other teams are closing the loop on data quality rather than just dropping records into the void!&lt;/P&gt;</description>
    <pubDate>Fri, 11 Sep 2026 10:59:08 GMT</pubDate>
    <dc:creator>Khasim_1</dc:creator>
    <dc:date>2026-09-11T10:59:08Z</dc:date>
    <item>
      <title>Designing an Effective "Quarantine" Pattern for Failed DLT Expectations</title>
      <link>https://community.databricks.com/t5/data-engineering/designing-an-effective-quot-quarantine-quot-pattern-for-failed/m-p/168345#M55903</link>
      <description>&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Hi everyone,&lt;/P&gt;&lt;P&gt;I’m building out a production&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Medallion Architecture&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;using&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Delta Live Tables (DLT)&lt;/STRONG&gt;, and I’m refining our strategy for handling data that fails&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Expectations&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;While&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;expect_or_drop&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;expect_or_fail&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;are straightforward, I’m struggling to find the "Gold Standard" for a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Quarantine pattern&lt;/STRONG&gt;—where we capture the bad data for manual review without stopping the entire pipeline or losing the original lineage.&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Are you creating a separate "Invalid" DLT table for every Silver table, or have you found a way to centralize all "Expectation Failures" into a single governed view?&lt;/LI&gt;&lt;LI&gt;How do you handle the "re-processing" lifecycle? Once a data steward corrects the source data, what is your preferred method for re-injecting that record into the DLT flow without triggering a full refresh?&lt;/LI&gt;&lt;LI&gt;Have you found that too many "Expectations" significantly impact the performance of DLT at the petabyte scale, or is the overhead negligible?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;I’d love to see how other teams are closing the loop on data quality rather than just dropping records into the void!&lt;/P&gt;</description>
      <pubDate>Fri, 11 Sep 2026 10:59:08 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/designing-an-effective-quot-quarantine-quot-pattern-for-failed/m-p/168345#M55903</guid>
      <dc:creator>Khasim_1</dc:creator>
      <dc:date>2026-09-11T10:59:08Z</dc:date>
    </item>
    <item>
      <title>Re: Designing an Effective "Quarantine" Pattern for Failed DLT Expectations</title>
      <link>https://community.databricks.com/t5/data-engineering/designing-an-effective-quot-quarantine-quot-pattern-for-failed/m-p/168351#M55907</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;Good questions. A few things that have worked.&lt;/P&gt;&lt;P&gt;On the quarantine pattern, the version most people land on first is two flows from the same source, one with the expectations and one with the inverted condition. It works, but it reads the source twice, which at your scale is the expensive part. The cheaper shape is a single silver table that keeps every row and carries the verdict as data: a boolean is_quarantined column plus a failed_rules array built from the same rule dictionary you feed to expect_all. Then you put two views on top, one filtered to valid and one to invalid, and downstream reads the valid view. One scan, full lineage preserved, and the bad rows sit next to the good ones rather than in a parallel universe.&lt;/P&gt;&lt;P&gt;For centralising across many silver tables, the blocker is schema heterogeneity. The approach that avoids a table per table is one central quarantine table with a fixed envelope schema: source_table, event_time, failed_rules as an array of strings, and the original row serialised into a single payload column. With VARIANT you get to keep it queryable rather than as opaque JSON. Every silver table writes into that one table via its own flow, and stewards work from one place.&lt;/P&gt;&lt;P&gt;On reprocessing, the piece you are probably missing is that a streaming table can have more than one flow writing into it. So alongside your main flow from bronze, define a second append flow sourced from a corrections table that your stewards write to. Corrected records land in the target through a normal append, no full refresh, no touching the main flow's checkpoint. If corrections need to supersede earlier versions of the same key rather than sit beside them, route them through AUTO CDC instead of a plain append so the upsert semantics do the work.&lt;/P&gt;&lt;P&gt;On performance, expectations themselves are cheap. They compile into the same plan and are evaluated in the pass you were already doing, so a long rule list costs far less than people expect. The overhead that actually shows up is structural rather than per rule: a second read of the source for quarantine, and any rule that reaches for a regex over a wide string column or a non trivial UDF. I would not prune rules for performance reasons before checking whether the pipeline is doing two scans where one would do.&lt;/P&gt;&lt;P&gt;One naming note in case you hit it in the docs: DLT is now Lakeflow Declarative Pipelines and APPLY CHANGES INTO is now AUTO CDC INTO. The older names still work, but the current documentation uses the new ones.&lt;/P&gt;</description>
      <pubDate>Fri, 11 Sep 2026 11:33:11 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/designing-an-effective-quot-quarantine-quot-pattern-for-failed/m-p/168351#M55907</guid>
      <dc:creator>Islam_hoti</dc:creator>
      <dc:date>2026-09-11T11:33:11Z</dc:date>
    </item>
  </channel>
</rss>

