Data Pipeline 101: Data Quality Checks
To sustain my work, I’ve opened up paid membership. If you find value in what I do, I’d really appreciate it if you considered upgrading; it helps me keep this work going :d
With only $7/month (billed annually), you can access all the materials you need to grow from junior → senior DE.
250+ deep-dive data engineering articles
practice-spark: 65 LeetCode-style problems to practice Spark SQL/DataFrame
learn-spark/dbt/airflow: CLI tools to master Spark/dbt/Airflow
If you’re a student with an education email, use this 50% ANNUAL DISCOUNT
If you’re a Vietnamese user, please DM me for an upgrade due to payment issues. As compensation for the inconvenience, you’ll get 50% OFF the annual plan.
Intro
The abstract goal of data engineering and software engineering is the same: deliver reliable solutions to some problems.
In software engineering, the solutions take the form of software
The solution's reliability depends on how well and safely the software performs.
In data engineering, the solution is a data foundation: a data architecture, a data set, a data pipeline, or … anything data users need.
The solution's reliability depends on data quality.
However, ensuring that is not easy.
This is because data is different from software. It's not just 0 or 1; it can have many states: correct but incomplete, correct but late, passing all tests but semantically wrong, or wrong without anyone realizing it…
Also, you can't "trial" data. You can't say, “Let's let 10 users try this first to see if there are any problems.” Data must be high-quality because it supports business decisions.
—
In this article, join me to learn and discuss the fundamentals of data quality checks in our field.
This article doesn’t try to give you every data quality check you should have or tutorials on how to implement them. Instead, I’m trying to give you the right mental model for thinking about data quality.
The rules
You might have heard about the famous data quality pillars: accuracy, completeness, consistency, timeliness, uniqueness…
They’re extremely helpful. They give you a kind of checklist.
There’s nothing wrong with them, but I prefer to think about data quality more abstractly so it ties more closely to the ultimate goal: serving the business.
—
The goal of the data quality check (or any check in the world) is to make sure the checked object meets some expectation.
The Great Expectation data quality platform did every good job here for picking that name :d
But for a dataset, where do the expectations come from?
To answer this question, we must think about the nature of the data:
It originates from business activities: a user visits a website, buys an item, or issues a refund
It’s captured so that the business owners can understand and optimize business activities: this month’s revenue, active users? Why do users churn so much? How did the marketing campaign perform? Does the new feature help?
So, the expectation of any dataset is that it must correctly reflect business activities so business users can trust it and make decisions based on it.
Data expectations are tied to business rules.
To me, the accuracy, completeness, consistency, timeliness, and uniqueness pillars are just categories:
Consistency: rules that ensure data reflect the business correctly, across all systems. If a customer’s address is updated in the operational database, it should be updated in the data warehouse.
Timeliness: rules that ensure data reflect the business in a timely manner so business users can make decisions based on fresh “reality“. The two-day-before, third-party data must be available at 7:00 daily.
Because the data expectations are tied to business rules, you must work with those who understand the business to materialize their understanding into rules. Yeah, you can argue that you don’t need this step to do the quality check.
You’re right, you can look at a table and write some rules yourself: email should have the correct format, unique fields must be unique, non-null fields should not contain null, …
The thing is, you're very likely to miss some “edge cases”; you interpret expectations from the table presentation, not how it’s expected and used.
To sustain my work, I’ve opened up paid membership. If you find value in what I do, I’d really appreciate it if you considered upgrading; it helps me keep this work going :d
With only $7/month (billed annually), you can access all the materials you need to grow from junior → senior DE.
250+ deep-dive data engineering articles
practice-spark: 65 LeetCode-style problems to practice Spark SQL/DataFrame
learn-spark/dbt/airflow: CLI tools to master Spark/dbt/Airflow
If you’re a student with an education email, use this 50% ANNUAL DISCOUNT
If you’re a Vietnamese user, please DM me for an upgrade due to payment issues. As compensation for the inconvenience, you’ll get 50% OFF the annual plan.
Subscribe to VuTrinh. to unlock the rest.
Become a paying subscriber of VuTrinh. to get access to this post and other subscriber-only content.
A subscription gets you:
© 2026 Vu Trinh
548 Market Street PMB 72296, San Francisco, CA 94104