<?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 Hi @Akash_Varuna, The count discrepancies you are seeing... in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/streaming-table-data-leakage-to-historical-permanent-table/m-p/150321#M53357</link>
    <description>&lt;P&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/153223"&gt;@Akash_Varuna&lt;/a&gt;,&lt;/P&gt;
&lt;P&gt;The count discrepancies you are seeing between stream_messages and messages are almost certainly caused by the 24-hour rolling window on your stream_messages table expiring data while the load_messages job is paused during your maintenance window.&lt;/P&gt;
&lt;P&gt;Here is what is happening step by step:&lt;/P&gt;
&lt;P&gt;WHAT IS CAUSING THE DATA LOSS&lt;/P&gt;
&lt;P&gt;1. Your load_messages job is paused for the maintenance window.&lt;BR /&gt;
2. While paused, the stream_messages table continues its 24-hour rolling window lifecycle. Events that arrived more than 24 hours ago are removed from stream_messages.&lt;BR /&gt;
3. When load_messages resumes, it picks up from the last tracked technical_sequenceNumber per partition. But some of the events it has not yet processed have already been aged out of stream_messages, so they are no longer available to read.&lt;BR /&gt;
4. Those "missing" events never make it into the messages table, creating the count discrepancy.&lt;/P&gt;
&lt;P&gt;This explains why days without a maintenance pause show matching counts (load_messages keeps up and processes events before they expire), while maintenance window days show gaps.&lt;/P&gt;
&lt;P&gt;The OPTIMIZE operation on the messages table is not the cause. OPTIMIZE on a Delta table does not modify data. It only compacts small files into larger ones, and Delta Lake's snapshot isolation protects both streaming and batch readers during this process. You can safely rule that out.&lt;/P&gt;
&lt;P&gt;RECOMMENDED SOLUTIONS&lt;/P&gt;
&lt;P&gt;Option 1: Extend the stream_messages retention window&lt;/P&gt;
&lt;P&gt;Increase the rolling window on stream_messages to be significantly longer than your maximum maintenance window duration. If your maintenance window is, say, 2 hours, a 24-hour window should be sufficient in theory. But if the window is approaching or exceeding the retention period, extend it (for example, to 48 or 72 hours). This gives you a safety margin so that no events expire before the resumed job can process them.&lt;/P&gt;
&lt;P&gt;Option 2: Avoid pausing load_messages during maintenance&lt;/P&gt;
&lt;P&gt;Since OPTIMIZE on the messages table is safe for concurrent readers and writers (Delta Lake guarantees this via MVCC), you do not need to pause load_messages during the optimization. You can run OPTIMIZE on the messages table while load_messages continues to operate. The Structured Streaming job will not be affected.&lt;/P&gt;
&lt;P&gt;From the Databricks documentation on OPTIMIZE:&lt;BR /&gt;
"Performing OPTIMIZE on a table that is a streaming source does not affect any current or future streams that treat this table as a source. Readers of Delta tables use snapshot isolation, which means that they are not interrupted when OPTIMIZE removes unnecessary files from the transaction log."&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.databricks.com/en/delta/optimize.html" target="_blank"&gt;https://docs.databricks.com/en/delta/optimize.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;If you are also running VACUUM on the messages table, that is also safe for concurrent operations as long as the retention period is set appropriately (default 7 days). There is no need to pause writers.&lt;/P&gt;
&lt;P&gt;Option 3: Switch to a true streaming read instead of batch read from stream_messages&lt;/P&gt;
&lt;P&gt;Your current pattern reads from stream_messages using spark.read.table() (batch mode) inside foreachBatch, with manual sequence number tracking. A more resilient approach would be to use spark.readStream from the upstream source (Event Hubs) directly, letting Spark Structured Streaming manage checkpoints and offsets automatically. This gives you:&lt;/P&gt;
&lt;P&gt;- Automatic offset tracking via checkpoints (no manual sequence number management)&lt;BR /&gt;
- Exactly-once processing guarantees to the Delta sink (when writing to Delta with foreachBatch and using idempotent writes, or using a direct Delta writeStream)&lt;BR /&gt;
- No dependency on the stream_messages rolling window&lt;/P&gt;
&lt;P&gt;This would look something like:&lt;/P&gt;
&lt;PRE&gt;(spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "&amp;lt;your-event-hubs-endpoint&amp;gt;:9093")
.option("subscribe", "&amp;lt;your-topic&amp;gt;")
.option("startingOffsets", "earliest")
.option("failOnDataLoss", "false")
.load()
.writeStream
.format("delta")
.option("checkpointLocation", "&amp;lt;checkpoint-path&amp;gt;")
.trigger(availableNow=True)
.toTable("messages")
)&lt;/PRE&gt;
&lt;P&gt;With this approach, the streaming checkpoint tracks exactly which offsets have been consumed. Even if the job is paused and restarted, it resumes from the last committed checkpoint offset, and there is no dependency on the stream_messages intermediate table retaining the data.&lt;/P&gt;
&lt;P&gt;For Event Hubs specifically, make sure your Event Hubs retention period is longer than your maximum expected downtime so that offsets remain available when the job restarts. Azure Event Hubs retention is configurable from 1 to 90 days (or unlimited with the Premium/Dedicated tier).&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.databricks.com/en/connect/streaming/kafka.html" target="_blank"&gt;https://docs.databricks.com/en/connect/streaming/kafka.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Option 4: Add a safety buffer to your EXPIRING_TIME filter&lt;/P&gt;
&lt;P&gt;If you keep the current architecture, consider making the EXPIRING_TIME filter aware of the maintenance window. Instead of a fixed 30-minute delay, you could track the last successful run timestamp and use it to ensure you process all records that arrived since the last run, regardless of how long the pause was.&lt;/P&gt;
&lt;P&gt;SUMMARY&lt;/P&gt;
&lt;P&gt;The most impactful fix is Option 2: simply stop pausing load_messages during the OPTIMIZE maintenance window. Delta Lake handles concurrent OPTIMIZE and writes safely. If you do need to pause, extend the stream_messages retention (Option 1) to cover the gap.&lt;/P&gt;
&lt;P&gt;For a longer-term improvement, Option 3 (reading directly from Event Hubs with checkpoint-based offset tracking) eliminates the rolling window dependency entirely and gives you the most robust pipeline.&lt;/P&gt;
&lt;P&gt;* This reply used an agent system I built to research and draft this response based on the wide set of documentation I have available and previous memory. I personally review the draft for any obvious issues and for monitoring system reliability and update it when I detect any drift, but there is still a small chance that something is inaccurate, especially if you are experimenting with brand new features.&lt;/P&gt;
&lt;P&gt;If this answer resolves your question, could you mark it as "Accept as Solution"? That helps other users quickly find the correct fix.&lt;/P&gt;</description>
    <pubDate>Mon, 09 Mar 2026 05:04:20 GMT</pubDate>
    <dc:creator>SteveOstrowski</dc:creator>
    <dc:date>2026-03-09T05:04:20Z</dc:date>
    <item>
      <title>Streaming Table data leakage to historical permanent table</title>
      <link>https://community.databricks.com/t5/data-engineering/streaming-table-data-leakage-to-historical-permanent-table/m-p/148694#M52949</link>
      <description>&lt;H1&gt;Data Leakage in Historical Table from Streaming Table&lt;/H1&gt;&lt;H2&gt;Environment&lt;/H2&gt;&lt;UL class=""&gt;&lt;LI&gt;&lt;STRONG&gt;Platform:&lt;/STRONG&gt; Azure Databricks + Azure Event Hubs&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Streaming Framework:&lt;/STRONG&gt; Spark Structured Streaming&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Storage:&lt;/STRONG&gt; Delta Lake&lt;/LI&gt;&lt;/UL&gt;&lt;HR /&gt;&lt;H2&gt;Pipeline&lt;/H2&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;PRE&gt;&lt;SPAN&gt;Event Hubs → stream_messages (live 24hr rolling window) → messages&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P class=""&gt;The load_messages notebook reads from stream_messages as a &lt;STRONG&gt;static batch inside foreachBatch&lt;/STRONG&gt;, manually tracking its position using technical_sequenceNumber per technical_partition, stored in last_seq_nums_per_partition. It applies an EXPIRING_TIME filter of 30 minutes where now is derived from max(context_updatedAt) of the current micro-batch:&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;python&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;PRE&gt;&lt;SPAN&gt;now &lt;SPAN class=""&gt;=&lt;/SPAN&gt; microbatch_df&lt;SPAN class=""&gt;.&lt;/SPAN&gt;agg&lt;SPAN class=""&gt;(&lt;/SPAN&gt;F&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;max&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;'context_updatedAt'&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;collect&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;&lt;SPAN class=""&gt;[&lt;/SPAN&gt;&lt;SPAN class=""&gt;0&lt;/SPAN&gt;&lt;SPAN class=""&gt;]&lt;/SPAN&gt;&lt;SPAN class=""&gt;[&lt;/SPAN&gt;&lt;SPAN class=""&gt;0&lt;/SPAN&gt;&lt;SPAN class=""&gt;]&lt;/SPAN&gt;
&lt;/SPAN&gt;
&lt;SPAN&gt;delayed_stream_increment &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;(&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;    spark&lt;SPAN class=""&gt;.&lt;/SPAN&gt;read&lt;SPAN class=""&gt;.&lt;/SPAN&gt;table&lt;SPAN class=""&gt;(&lt;/SPAN&gt;input_stream_table_name&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;    &lt;SPAN class=""&gt;.&lt;/SPAN&gt;where&lt;SPAN class=""&gt;(&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;        &lt;SPAN class=""&gt;reduce&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;            &lt;SPAN class=""&gt;lambda&lt;/SPAN&gt; x&lt;SPAN class=""&gt;,&lt;/SPAN&gt; y&lt;SPAN class=""&gt;:&lt;/SPAN&gt; x &lt;SPAN class=""&gt;|&lt;/SPAN&gt; y&lt;SPAN class=""&gt;,&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;            &lt;SPAN class=""&gt;[&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;                &lt;SPAN class=""&gt;(&lt;/SPAN&gt;F&lt;SPAN class=""&gt;.&lt;/SPAN&gt;col&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;'technical_partition'&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt; &lt;SPAN class=""&gt;==&lt;/SPAN&gt; partition&lt;SPAN class=""&gt;)&lt;/SPAN&gt; &lt;SPAN class=""&gt;&amp;amp;&lt;/SPAN&gt; &lt;SPAN class=""&gt;(&lt;/SPAN&gt;F&lt;SPAN class=""&gt;.&lt;/SPAN&gt;col&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;'technical_sequenceNumber'&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt; &lt;SPAN class=""&gt;&amp;gt;&lt;/SPAN&gt; last_record_number&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;                &lt;SPAN class=""&gt;for&lt;/SPAN&gt; partition&lt;SPAN class=""&gt;,&lt;/SPAN&gt; last_record_number &lt;SPAN class=""&gt;in&lt;/SPAN&gt; last_seq_nums_per_partition&lt;SPAN class=""&gt;.&lt;/SPAN&gt;items&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;            &lt;SPAN class=""&gt;]&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;        &lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;    &lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;    &lt;SPAN class=""&gt;.&lt;/SPAN&gt;where&lt;SPAN class=""&gt;(&lt;/SPAN&gt;F&lt;SPAN class=""&gt;.&lt;/SPAN&gt;col&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;'context_updatedAt'&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt; &lt;SPAN class=""&gt;&amp;lt;&lt;/SPAN&gt; now &lt;SPAN class=""&gt;-&lt;/SPAN&gt; EXPIRING_TIME&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;HR /&gt;&lt;H2&gt;The Problem&lt;/H2&gt;&lt;P class=""&gt;There is a scheduled maintenance window for &lt;STRONG&gt;optimizing the messages table&lt;/STRONG&gt;. During this window the load_messages job is paused. When comparing counts between stream_messages and messages for the affected dates, we see discrepancies for some days and some days there is no&amp;nbsp;discrepancies&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Example for today (2026-02-17), stream_messages and messages have the &lt;STRONG&gt;same count&lt;/STRONG&gt; — confirming the leakage is tied specifically to the optimization/maintenance window dates.&lt;BR /&gt;&lt;BR /&gt;I have looked and am not sure is it because of the Optimizing Task which causes this leakage because the micro batch is dropped?&lt;BR /&gt;&lt;BR /&gt;Please if you have any idea on alternatives to avoid this please do let me know and the possible reason for this in current set up.&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;/P&gt;</description>
      <pubDate>Wed, 18 Feb 2026 13:01:48 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/streaming-table-data-leakage-to-historical-permanent-table/m-p/148694#M52949</guid>
      <dc:creator>Akash_Varuna</dc:creator>
      <dc:date>2026-02-18T13:01:48Z</dc:date>
    </item>
    <item>
      <title>Hi @Akash_Varuna, The count discrepancies you are seeing...</title>
      <link>https://community.databricks.com/t5/data-engineering/streaming-table-data-leakage-to-historical-permanent-table/m-p/150321#M53357</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/153223"&gt;@Akash_Varuna&lt;/a&gt;,&lt;/P&gt;
&lt;P&gt;The count discrepancies you are seeing between stream_messages and messages are almost certainly caused by the 24-hour rolling window on your stream_messages table expiring data while the load_messages job is paused during your maintenance window.&lt;/P&gt;
&lt;P&gt;Here is what is happening step by step:&lt;/P&gt;
&lt;P&gt;WHAT IS CAUSING THE DATA LOSS&lt;/P&gt;
&lt;P&gt;1. Your load_messages job is paused for the maintenance window.&lt;BR /&gt;
2. While paused, the stream_messages table continues its 24-hour rolling window lifecycle. Events that arrived more than 24 hours ago are removed from stream_messages.&lt;BR /&gt;
3. When load_messages resumes, it picks up from the last tracked technical_sequenceNumber per partition. But some of the events it has not yet processed have already been aged out of stream_messages, so they are no longer available to read.&lt;BR /&gt;
4. Those "missing" events never make it into the messages table, creating the count discrepancy.&lt;/P&gt;
&lt;P&gt;This explains why days without a maintenance pause show matching counts (load_messages keeps up and processes events before they expire), while maintenance window days show gaps.&lt;/P&gt;
&lt;P&gt;The OPTIMIZE operation on the messages table is not the cause. OPTIMIZE on a Delta table does not modify data. It only compacts small files into larger ones, and Delta Lake's snapshot isolation protects both streaming and batch readers during this process. You can safely rule that out.&lt;/P&gt;
&lt;P&gt;RECOMMENDED SOLUTIONS&lt;/P&gt;
&lt;P&gt;Option 1: Extend the stream_messages retention window&lt;/P&gt;
&lt;P&gt;Increase the rolling window on stream_messages to be significantly longer than your maximum maintenance window duration. If your maintenance window is, say, 2 hours, a 24-hour window should be sufficient in theory. But if the window is approaching or exceeding the retention period, extend it (for example, to 48 or 72 hours). This gives you a safety margin so that no events expire before the resumed job can process them.&lt;/P&gt;
&lt;P&gt;Option 2: Avoid pausing load_messages during maintenance&lt;/P&gt;
&lt;P&gt;Since OPTIMIZE on the messages table is safe for concurrent readers and writers (Delta Lake guarantees this via MVCC), you do not need to pause load_messages during the optimization. You can run OPTIMIZE on the messages table while load_messages continues to operate. The Structured Streaming job will not be affected.&lt;/P&gt;
&lt;P&gt;From the Databricks documentation on OPTIMIZE:&lt;BR /&gt;
"Performing OPTIMIZE on a table that is a streaming source does not affect any current or future streams that treat this table as a source. Readers of Delta tables use snapshot isolation, which means that they are not interrupted when OPTIMIZE removes unnecessary files from the transaction log."&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.databricks.com/en/delta/optimize.html" target="_blank"&gt;https://docs.databricks.com/en/delta/optimize.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;If you are also running VACUUM on the messages table, that is also safe for concurrent operations as long as the retention period is set appropriately (default 7 days). There is no need to pause writers.&lt;/P&gt;
&lt;P&gt;Option 3: Switch to a true streaming read instead of batch read from stream_messages&lt;/P&gt;
&lt;P&gt;Your current pattern reads from stream_messages using spark.read.table() (batch mode) inside foreachBatch, with manual sequence number tracking. A more resilient approach would be to use spark.readStream from the upstream source (Event Hubs) directly, letting Spark Structured Streaming manage checkpoints and offsets automatically. This gives you:&lt;/P&gt;
&lt;P&gt;- Automatic offset tracking via checkpoints (no manual sequence number management)&lt;BR /&gt;
- Exactly-once processing guarantees to the Delta sink (when writing to Delta with foreachBatch and using idempotent writes, or using a direct Delta writeStream)&lt;BR /&gt;
- No dependency on the stream_messages rolling window&lt;/P&gt;
&lt;P&gt;This would look something like:&lt;/P&gt;
&lt;PRE&gt;(spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "&amp;lt;your-event-hubs-endpoint&amp;gt;:9093")
.option("subscribe", "&amp;lt;your-topic&amp;gt;")
.option("startingOffsets", "earliest")
.option("failOnDataLoss", "false")
.load()
.writeStream
.format("delta")
.option("checkpointLocation", "&amp;lt;checkpoint-path&amp;gt;")
.trigger(availableNow=True)
.toTable("messages")
)&lt;/PRE&gt;
&lt;P&gt;With this approach, the streaming checkpoint tracks exactly which offsets have been consumed. Even if the job is paused and restarted, it resumes from the last committed checkpoint offset, and there is no dependency on the stream_messages intermediate table retaining the data.&lt;/P&gt;
&lt;P&gt;For Event Hubs specifically, make sure your Event Hubs retention period is longer than your maximum expected downtime so that offsets remain available when the job restarts. Azure Event Hubs retention is configurable from 1 to 90 days (or unlimited with the Premium/Dedicated tier).&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.databricks.com/en/connect/streaming/kafka.html" target="_blank"&gt;https://docs.databricks.com/en/connect/streaming/kafka.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Option 4: Add a safety buffer to your EXPIRING_TIME filter&lt;/P&gt;
&lt;P&gt;If you keep the current architecture, consider making the EXPIRING_TIME filter aware of the maintenance window. Instead of a fixed 30-minute delay, you could track the last successful run timestamp and use it to ensure you process all records that arrived since the last run, regardless of how long the pause was.&lt;/P&gt;
&lt;P&gt;SUMMARY&lt;/P&gt;
&lt;P&gt;The most impactful fix is Option 2: simply stop pausing load_messages during the OPTIMIZE maintenance window. Delta Lake handles concurrent OPTIMIZE and writes safely. If you do need to pause, extend the stream_messages retention (Option 1) to cover the gap.&lt;/P&gt;
&lt;P&gt;For a longer-term improvement, Option 3 (reading directly from Event Hubs with checkpoint-based offset tracking) eliminates the rolling window dependency entirely and gives you the most robust pipeline.&lt;/P&gt;
&lt;P&gt;* This reply used an agent system I built to research and draft this response based on the wide set of documentation I have available and previous memory. I personally review the draft for any obvious issues and for monitoring system reliability and update it when I detect any drift, but there is still a small chance that something is inaccurate, especially if you are experimenting with brand new features.&lt;/P&gt;
&lt;P&gt;If this answer resolves your question, could you mark it as "Accept as Solution"? That helps other users quickly find the correct fix.&lt;/P&gt;</description>
      <pubDate>Mon, 09 Mar 2026 05:04:20 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/streaming-table-data-leakage-to-historical-permanent-table/m-p/150321#M53357</guid>
      <dc:creator>SteveOstrowski</dc:creator>
      <dc:date>2026-03-09T05:04:20Z</dc:date>
    </item>
  </channel>
</rss>

