<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rui Wang</title>
    <description>The latest articles on DEV Community by Rui Wang (@jerry_king_d0ee94a9bca82f).</description>
    <link>https://dev.to/jerry_king_d0ee94a9bca82f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048573%2F96b9b76d-a872-453b-a795-96654dc0be10.png</url>
      <title>DEV Community: Rui Wang</title>
      <link>https://dev.to/jerry_king_d0ee94a9bca82f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jerry_king_d0ee94a9bca82f"/>
    <language>en</language>
    <item>
      <title>The pipeline passed. The data still needs proof.</title>
      <dc:creator>Rui Wang</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:22:55 +0000</pubDate>
      <link>https://dev.to/jerry_king_d0ee94a9bca82f/the-pipeline-passed-the-data-still-needs-proof-4coa</link>
      <guid>https://dev.to/jerry_king_d0ee94a9bca82f/the-pipeline-passed-the-data-still-needs-proof-4coa</guid>
      <description>&lt;p&gt;A pipeline job finishes without an error. The new table has 18% fewer rows.&lt;br&gt;
Should you rerun the pipeline, stop the release, or trust the new output?&lt;/p&gt;

&lt;p&gt;Before rerunning the job, preserve the two states you need to compare. A rerun&lt;br&gt;
can create another state and make the original change harder to explain. The&lt;br&gt;
first useful question is: which two states are we actually comparing?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pin down the before and after
&lt;/h2&gt;

&lt;p&gt;"Yesterday" and "latest" sound precise until a file is replaced or a table&lt;br&gt;
advances to another snapshot.&lt;/p&gt;

&lt;p&gt;Give both states durable identities. That might mean a file checksum, an object&lt;br&gt;
version, a Delta table version, an Iceberg snapshot, a catalog reference, or a&lt;br&gt;
pipeline run ID. Record the local time and timezone too. They help when logs and&lt;br&gt;
object histories use different clocks.&lt;/p&gt;

&lt;p&gt;Suppose a Delta table's row-count drop occurred between versions 842 and 849.&lt;br&gt;
Those two numbers turn a vague report into a reproducible question. Without&lt;br&gt;
them, another engineer may inspect version 850 and reach a different conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the smallest useful explanation
&lt;/h2&gt;

&lt;p&gt;An unexpected nullable column and a lower row count point to different first&lt;br&gt;
checks.&lt;/p&gt;

&lt;p&gt;If a column became nullable, compare the two schemas before scanning rows.&lt;br&gt;
Check whether the field changed type, moved inside a nested structure, or was&lt;br&gt;
renamed. A CSV inference change and a Parquet schema change may look similar in&lt;br&gt;
a grid, but they are different events.&lt;/p&gt;

&lt;p&gt;If the row count changed, group counts by the partition or date most likely to&lt;br&gt;
explain it. A full profile of every column may cost more than the original query&lt;br&gt;
while hiding the useful difference.&lt;/p&gt;

&lt;p&gt;Delta and Iceberg add another question: which logical table state did the&lt;br&gt;
reader resolve? The newest objects in storage do not necessarily belong to the&lt;br&gt;
selected state. Check the version or snapshot, the metadata chain, and the data&lt;br&gt;
or delete files involved before blaming an individual file.&lt;/p&gt;

&lt;p&gt;The aim is a smaller search area. A larger report can wait until the evidence&lt;br&gt;
calls for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  State what the check can prove
&lt;/h2&gt;

&lt;p&gt;The same finding means something different when it comes from metadata, a&lt;br&gt;
sample, or every relevant row.&lt;/p&gt;

&lt;p&gt;Metadata can establish recorded schema, partition information, and available&lt;br&gt;
statistics. It cannot prove a claim about every row. A sample helps discover a&lt;br&gt;
pattern, but a missing value in the sample does not prove that the value is&lt;br&gt;
absent. A full scan supports stronger row-level claims, provided it covered&lt;br&gt;
every relevant partition and delete.&lt;/p&gt;

&lt;p&gt;Record truncation, skipped objects, unsupported semantics, cancellation, and&lt;br&gt;
fallback behavior. If one of them prevents a conclusion, call the result&lt;br&gt;
&lt;code&gt;incomplete&lt;/code&gt;. That is more useful than a clean-looking result with a hidden gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leave evidence another engineer can challenge
&lt;/h2&gt;

&lt;p&gt;A short record is enough when another engineer can understand the decision and&lt;br&gt;
repeat the check.&lt;/p&gt;

&lt;p&gt;A fictional record might look like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Recorded value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Question&lt;/td&gt;
&lt;td&gt;Why did the table lose 18% of its rows?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inputs&lt;/td&gt;
&lt;td&gt;Delta table versions 842 and 849.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks&lt;/td&gt;
&lt;td&gt;Schema comparison and row counts grouped by day.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Metadata plus a full scan of the affected partition.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outcome&lt;/td&gt;
&lt;td&gt;Warning. The drop is isolated to July 25, 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limit&lt;/td&gt;
&lt;td&gt;Delete semantics were not checked, so the cause remains unproven.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep credentials, signed URLs, private paths, secret-bearing SQL, customer data,&lt;br&gt;
and private screenshots out of the record.&lt;/p&gt;

&lt;p&gt;Before running the checks, define the finish line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pass&lt;/strong&gt; means the stated rule held over the recorded scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning&lt;/strong&gt; means the result needs review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure&lt;/strong&gt; means the evidence disproved the rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incomplete&lt;/strong&gt; means the available evidence cannot support a conclusion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leave enough evidence for another engineer to reproduce the result, disagree&lt;br&gt;
with it, and run the investigation again.&lt;/p&gt;

&lt;h2&gt;
  
  
  One question for data engineers
&lt;/h2&gt;

&lt;p&gt;Which part of this work usually costs you the most time?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding an unexpected schema change&lt;/li&gt;
&lt;li&gt;Finding why row counts or profiles changed&lt;/li&gt;
&lt;li&gt;Understanding the real state of a Delta or Iceberg table&lt;/li&gt;
&lt;li&gt;Comparing pipeline output before and after a change&lt;/li&gt;
&lt;li&gt;Proving that a delivery or release is safe&lt;/li&gt;
&lt;li&gt;Something else&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A one-number comment is enough. Please do not post confidential data, file&lt;br&gt;
paths, SQL, schemas, credentials, customer information, or screenshots.&lt;/p&gt;

&lt;p&gt;If you prefer email, the same one-question prompt is available on the&lt;br&gt;
&lt;a href="https://bigdatasight.com/research" rel="noopener noreferrer"&gt;BigdataSight research page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build BigdataSight, a native Mac data workstation. We are&lt;br&gt;
researching evidence-backed tools for investigating changes in files and&lt;br&gt;
lakehouse tables. The product direction described here remains research and is&lt;br&gt;
not a shipping capability.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>database</category>
      <category>bigdata</category>
      <category>lakehouse</category>
    </item>
  </channel>
</rss>
