{"id":4927,"date":"2026-05-23T23:07:22","date_gmt":"2026-05-23T23:07:22","guid":{"rendered":"https:\/\/ranaghazzi.com\/?p=4927"},"modified":"2026-05-26T03:08:21","modified_gmt":"2026-05-26T03:08:21","slug":"data-quality-checks","status":"publish","type":"post","link":"https:\/\/ranaghazzi.com\/?p=4927","title":{"rendered":"Data Quality Checks"},"content":{"rendered":"<p><style>\n    .light-font-container, .light-font-container p, .light-font-container h2, .light-font-container li {<br \/>\n        font-weight: #FFFFFF !important;<br \/>\n    }<br \/>\n<\/style>\n<\/p>\n<div class=\"light-font-container\" style=\"background-color: #FFFFFF; padding: 40px; border-radius: 15px;\">\n\n\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-513dc8012042b81e135295d6ff9e8d84 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-8b3680d63d82ba52181fe5328823a2e5 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-c62008b07352a4d96e99bb007a62ee1f has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-cad064b26909c09998440d7c6d3b5e3f has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-ec207060d208b3d4e2d08a1dd2debd5c has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:28px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-be2b30a3cc79fc1dc76d5058a6fde7d3 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading has-text-align-center has-x-large-font-size\">  Quality Checks:<\/h4>\n\n\n\n<div style=\"height:17px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. <strong>Lakeflow Declarative Pipelines<\/strong> expectations:<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><strong><a href=\"https:\/\/docs.databricks.com\/aws\/en\/ldp\/expectations\">What are expectations?<\/a><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expectations are optional clauses in pipeline&nbsp;materialized view,&nbsp;streaming table, or view creation statements that apply data quality checks on each record passing through a query. Expectations use standard SQL Boolean statements to specify constraints. You can combine multiple expectations for a single dataset and set expectations across all dataset declarations in a pipeline.<\/p>\n\n\n\n<div style=\"height:13px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\"><strong>Behavior on Violation:<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Specify an action to determine what happens when a record fails the validation check. The following table describes the available actions:<\/p>\n\n\n\n<div class=\"wp-block-group is-style-section-5 has-contrast-color has-base-background-color has-text-color has-background has-link-color has-medium-font-size wp-elements-2a610b1813cd36110a47fd0a97bed463 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained is-style-section-5--1\">\n<p class=\"wp-block-paragraph\">dp.expect_or_fail       &#8211; This expectation causes a failure of a single flow<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dp.expect_or_drop     &#8211; Invalid records are dropped before data is written to the target<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dp.expect &#8211; Invalid records are written to the target.<\/p>\n<\/div>\n\n\n\n<div style=\"height:14px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The key advantage over external quality tools is that the check happens at write time inside the pipeline, not as a separate job after the fact. Bad data never reaches the next layer.<\/li>\n\n\n\n<li>You can also implement advanced logic to quarantine invalid records without failing or dropping data.<\/li>\n\n\n\n<li>You can group multiple expectations together and specify collective actions using the functions&nbsp;expect_all,&nbsp;expect_all_or_drop, and&nbsp;expect_all_or_fail.<br><\/li>\n\n\n\n<li><strong>Note:<\/strong>&nbsp;@dp pipelines can&#8217;t run in a regular notebook \u2014 only&nbsp;streaming tables,&nbsp;materialized views, and temporary views support expectations, data quality metrics are supported only for these object type.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:13px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-x-large-font-size\">2. Manage data quality &#8211; Regular Delta Tables<\/h3>\n\n\n\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">for regular delta table No built-in expectation framework. You have to enforce quality manually three ways:<\/p>\n\n\n\n<div style=\"height:7px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\"><strong>Option 1 \u2014 Filter before writing<\/strong><\/h3>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-style-section-5 has-contrast-color has-accent-1-background-color has-text-color has-background has-link-color has-medium-font-size wp-elements-84b8a3868808934fec3ca13ae8c02c08 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained is-style-section-5--2\">\n<p class=\"has-base-background-color has-background wp-block-paragraph\">df_clean = df.filter(&#8220;amount &gt; 0 AND customer_id IS NOT NULL&#8221;) df_clean.write.format(&#8220;delta&#8221;).mode(&#8220;append&#8221;).saveAsTable(&#8220;silver_transactions&#8221;)\\   Simple but silent \u2014 violations are just dropped with no logging.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:14px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\"><strong>Option 2 \u2014 Write bad records to a quarantine table<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Quarantining separates good data from bad data during pipeline execution \u2014 good rows flow into the target table while bad rows are stored separately for review and reprocessing. Once a quarantined record is reviewed and corrected, it can be rerun through the pipeline and inserted into the target table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Databricks provides two built-in quarantine mechanisms:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1.&nbsp;badRecordsPath&nbsp;\u2014 captures bad records or files encountered during data loading and writes them to a specified path:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spark.read \\    \n.option(\"badRecordsPath\", \"\/Volumes\/workspace\/quarantine\/ibm\") \\    .parquet(\"\/Volumes\/workspace\/bronze\/landing_zone\/ibm_landing\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2.<\/strong> Auto Loader rescued data column&nbsp;\u2014 any data that does not match the target schema is automatically captured in a&nbsp;_rescued_data&nbsp;column instead of failing or being silently dropped:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>stream_df = spark.readStream \\   \n .format(\"cloudFiles\") \\    \n.option(\"cloudFiles.schemaEvolutionMode\", \"rescue\") \\    .load(\"\/Volumes\/workspace\/bronze\/landing_zone\/ibm_landing\")<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">3. Custom quarantine pattern&nbsp;\u2014 split good and bad rows explicitly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>good_rows = source_casted.filter(col(\"Close\") &gt; 0)\nbad_rows  = source_casted.filter(col(\"Close\") &lt;= 0)\ngood_rows.write.mode(\"append\").table(f\"{catalog}.silver.ibm\")\nbad_rows.write.mode(\"append\").table(f\"{catalog}.silver.ibm_quarantine\")<\/code><\/pre>\n\n\n\n<div style=\"height:17px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\"><strong>Option 3 \u2014 Use Great Expectations or Soda<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">External libraries that add @dp -like rule definitions to regular Spark pipelines.- More setup but works outside Databricks too.<br><strong>Bottom line:<\/strong> @dp is the cleaner approach if you&#8217;re fully on Databricks. Regular Delta gives you more portability but you own all the quality instrumentation yourself<\/p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. Delta table <strong>constraints<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Delta table <strong>constraints<\/strong> are an automated mechanism for enforcing data quality and integrity by verifying that any data added to a table meets specific rules. Unlike passive monitoring, enforced constraints strictly prevent &#8220;bad&#8221; data from being committed to the table; if a record violates a constraint, the operation fails<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><strong>Core Enforced Constraints:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Delta Lake currently supports two types of strictly enforced constraints for data quality:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NOT NULL Constraints<\/strong>: These ensure that specific columns never contain null values.<\/li>\n\n\n\n<li><strong>CHECK Constraints<\/strong>: These ensure that every row satisfies a specific Boolean SQL expression.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><strong>Informational Constraints<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.databricks.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Databricks<\/a> also support Primary Key and <strong>Foreign Key<\/strong> constraints.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Non-Enforced<\/strong>: These are typically informational only and are not strictly enforced during writes.<\/li>\n\n\n\n<li>Query Optimization: While they don&#8217;t block bad data, they help query engines optimize joins and aggregations.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Comparison: Constraints vs. DLT Expectation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expectations<\/strong> provide a more flexible alternative to standard constraints: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Expectations: Allow for multiple &#8220;actions&#8221; on failure\u2014warning (keep record), dropping the row, or failing the entire pipeline.<\/li>\n\n\n\n<li>Standard Constraints: Always result in a &#8220;Fail Update&#8221; behavior, making them better for mission-critical data where no errors can be tolerated<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div style=\"height:18px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Comparison to other strategies:<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"><\/th><th class=\"has-text-align-left\" data-align=\"left\">Constraints<\/th><th class=\"has-text-align-left\" data-align=\"left\">Quarantine<\/th><th class=\"has-text-align-left\" data-align=\"left\">DLT expect<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Bad row behavior<\/td><td class=\"has-text-align-left\" data-align=\"left\">Fails batch<\/td><td class=\"has-text-align-left\" data-align=\"left\">Saves separately<\/td><td class=\"has-text-align-left\" data-align=\"left\">Configurable<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Audit trail<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u2705 Table metadata<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u2705 Quarantine table<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u2705 DLT metrics<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Granularity<\/td><td class=\"has-text-align-left\" data-align=\"left\">Row level<\/td><td class=\"has-text-align-left\" data-align=\"left\">Row level<\/td><td class=\"has-text-align-left\" data-align=\"left\">Row level<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pipeline stops?<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u2705 Yes<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u274c No<\/td><td class=\"has-text-align-left\" data-align=\"left\">Configurable<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:74px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Schema handling:<\/h2>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">Schema handling in <a href=\"https:\/\/www.databricks.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Databricks<\/a> primarily revolves around ensuring data quality while allowing for structural changes over time. It is managed through two main mechanisms: <strong>Schema Enforcement<\/strong> (preventing bad data) and <strong>Schema Evolution<\/strong> (adapting to new structures).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Core Schema Mechanisms<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Schema Enforcement (Validation):<\/strong> By default, Delta Lake enforces that all data written to a table matches the existing schema. It rejects any writes containing extra columns or incompatible data types to prevent &#8220;data pollution&#8221;.<\/li>\n\n\n\n<li><strong>Schema Evolution:<\/strong> This allows a table&#8217;s schema to change automatically to accommodate new data. It is often triggered during append or overwrite operations by setting the .option(&#8220;mergeSchema&#8221;, &#8220;true&#8221;).ction.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Common Handling Strategies<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inference &amp; Auto Loader:<\/strong> When ingesting data from cloud storage, <a href=\"https:\/\/docs.databricks.com\/aws\/en\/ingestion\/cloud-object-storage\/auto-loader\/schema\" target=\"_blank\" rel=\"noreferrer noopener\">Auto Loader<\/a> can automatically infer schemas and detect changes. It uses a schemaLocation to track structural versions over time.<\/li>\n\n\n\n<li><strong>Rescued Data Column:<\/strong> To prevent data loss when a schema mismatch occurs, you can enable a &#8220;rescued data column&#8221; which captures unexpected fields or type mismatches in a JSON blob for later inspection.<\/li>\n\n\n\n<li><strong>Explicit Schema Definition:<\/strong> For critical production tables, engineers often explicitly define the schema using DDL (Data Definition Language) or pyspark.sql.types.StructType to maintain strict control.<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quality Checks: 1. Lakeflow Declarative Pipelines expectations: What are expectations? Expectations are optional clauses in pipeline&nbsp;materialized view,&nbsp;streaming table, or view creation statements that apply data quality checks on each record passing through a query. Expectations use standard SQL Boolean statements to specify constraints. You can combine multiple expectations for a single dataset and set expectations [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4927","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Data Quality Checks - Rana Nasri Ghazzi<\/title>\n<meta name=\"description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ranaghazzi.com\/?p=4927\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Quality Checks - Rana Nasri Ghazzi\" \/>\n<meta property=\"og:description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ranaghazzi.com\/?p=4927\" \/>\n<meta property=\"og:site_name\" content=\"Rana Nasri Ghazzi\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-23T23:07:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-26T03:08:21+00:00\" \/>\n<meta name=\"author\" content=\"Rana Ghazzi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rana Ghazzi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927#article\",\"isPartOf\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927\"},\"author\":{\"name\":\"Rana Ghazzi\",\"@id\":\"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"headline\":\"Data Quality Checks\",\"datePublished\":\"2026-05-23T23:07:22+00:00\",\"dateModified\":\"2026-05-26T03:08:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927\"},\"wordCount\":896,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ranaghazzi.com\/?p=4927#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927\",\"url\":\"https:\/\/ranaghazzi.com\/?p=4927\",\"name\":\"Data Quality Checks - Rana Nasri Ghazzi\",\"isPartOf\":{\"@id\":\"https:\/\/ranaghazzi.com\/#website\"},\"datePublished\":\"2026-05-23T23:07:22+00:00\",\"dateModified\":\"2026-05-26T03:08:21+00:00\",\"description\":\"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.\",\"breadcrumb\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ranaghazzi.com\/?p=4927\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ranaghazzi.com\/?p=4927#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ranaghazzi.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Quality Checks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ranaghazzi.com\/#website\",\"url\":\"https:\/\/ranaghazzi.com\/\",\"name\":\"Rana Nasri Ghazzi\",\"description\":\"Turning Data into Decisions\",\"publisher\":{\"@id\":\"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ranaghazzi.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc\",\"name\":\"Rana Ghazzi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png\",\"url\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png\",\"contentUrl\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png\",\"width\":1024,\"height\":1024,\"caption\":\"Rana Ghazzi\"},\"logo\":{\"@id\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png\"},\"url\":\"https:\/\/ranaghazzi.com\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Data Quality Checks - Rana Nasri Ghazzi","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ranaghazzi.com\/?p=4927","og_locale":"en_US","og_type":"article","og_title":"Data Quality Checks - Rana Nasri Ghazzi","og_description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","og_url":"https:\/\/ranaghazzi.com\/?p=4927","og_site_name":"Rana Nasri Ghazzi","article_published_time":"2026-05-23T23:07:22+00:00","article_modified_time":"2026-05-26T03:08:21+00:00","author":"Rana Ghazzi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rana Ghazzi","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ranaghazzi.com\/?p=4927#article","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/?p=4927"},"author":{"name":"Rana Ghazzi","@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"headline":"Data Quality Checks","datePublished":"2026-05-23T23:07:22+00:00","dateModified":"2026-05-26T03:08:21+00:00","mainEntityOfPage":{"@id":"https:\/\/ranaghazzi.com\/?p=4927"},"wordCount":896,"commentCount":0,"publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ranaghazzi.com\/?p=4927#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ranaghazzi.com\/?p=4927","url":"https:\/\/ranaghazzi.com\/?p=4927","name":"Data Quality Checks - Rana Nasri Ghazzi","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/#website"},"datePublished":"2026-05-23T23:07:22+00:00","dateModified":"2026-05-26T03:08:21+00:00","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","breadcrumb":{"@id":"https:\/\/ranaghazzi.com\/?p=4927#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ranaghazzi.com\/?p=4927"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ranaghazzi.com\/?p=4927#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ranaghazzi.com\/"},{"@type":"ListItem","position":2,"name":"Data Quality Checks"}]},{"@type":"WebSite","@id":"https:\/\/ranaghazzi.com\/#website","url":"https:\/\/ranaghazzi.com\/","name":"Rana Nasri Ghazzi","description":"Turning Data into Decisions","publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ranaghazzi.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc","name":"Rana Ghazzi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","url":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","contentUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","width":1024,"height":1024,"caption":"Rana Ghazzi"},"logo":{"@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png"},"url":"https:\/\/ranaghazzi.com\/?author=2"}]}},"_links":{"self":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/4927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4927"}],"version-history":[{"count":56,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/4927\/revisions"}],"predecessor-version":[{"id":5107,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/4927\/revisions\/5107"}],"wp:attachment":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}