<?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>article Metadata-Driven ETL Framework in Databricks (Part-1) in Technical Blog</title>
    <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/ba-p/92666</link>
    <description>&lt;P&gt;&lt;SPAN&gt;In modern data-driven enterprises, data flows like lifeblood through complex systems and repositories to drive decision-making and innovation. Each dataset, whether structured or unstructured, holds the potential to unlock insights and drive innovation. However, transforming raw data into actionable intelligence is a complex challenge that demands a dynamic, adaptable framework capable of accelerating data ingestion and transformation.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In this three-part blog, we will cover the metadata setup (part 1), orchestration (part 2), and deployment process (part 3) of a configuration/metadata-driven ETL framework in Databricks following the Lakehouse architecture.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;H1&gt;&lt;SPAN&gt;Why do we need an ETL Framework?&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;An ETL framework is essential for efficiently managing data integration processes. It standardizes data extraction, transformation, and loading, ensuring consistency, scalability, and reliability in modern data platforms.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;While metadata-driven, automated ETL pipeline creation sounds appealing, it may introduce maintenance overhead and struggle to scale efficiently when the complexity of the transformation process varies too much.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;What we need instead is a framework that is&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Consistent&lt;/STRONG&gt;&lt;SPAN&gt; - has a consistent template that developers can utilize to build pipelines quickly.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-level="1"&gt;&lt;STRONG&gt;Modular -&amp;nbsp; &lt;/STRONG&gt;&lt;SPAN&gt;with&lt;/SPAN&gt; &lt;SPAN&gt;modular components that can be reused across different data pipelines, which reduces duplication of effort and makes maintenance easier.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-level="1"&gt;&lt;STRONG&gt;Scalable - &lt;/STRONG&gt;&lt;SPAN&gt;able to support scalable ETL of different layers with various complexities.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-level="1"&gt;&lt;STRONG&gt;Auditable and traceable—&lt;/STRONG&gt;&lt;SPAN&gt;provides audit trails for tracking job run execution and errors, which is critical for compliance, debugging, and monitoring.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-level="1"&gt;&lt;STRONG&gt;Seamlessly integrated with the CI-CD practices - &lt;/STRONG&gt;&lt;SPAN&gt;should not add unnecessary burden to the CI-CD pipelines and ensures rapid deployment.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;LI-WRAPPER&gt;&amp;nbsp;&lt;/LI-WRAPPER&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;Significance of ETL Framework in Databricks&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;Having an ETL framework in Databricks is crucial for building a Lakehouse architecture as it streamlines the data integration, transformation, and management in the different data layers, such as the bronze, silver, and gold layers, which are core components of the lakehouse. The framework uses a templated approach to build data assets across all these layers to accelerate data transformation and enrichment.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&lt;SPAN&gt;High-Level Design&lt;/SPAN&gt;&lt;/H1&gt;
&lt;H2&gt;&lt;SPAN&gt;Lakehouse architecture&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;A typical Lakehouse architecture consists of the following layers:&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; Landing Data Layer&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Raw Data Storage:&lt;/STRONG&gt;&lt;SPAN&gt; Data from various sources (structured and unstructured) is extracted and landed as they were from the source in a cloud object storage.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Batch and Stream Ingestion:&lt;/STRONG&gt;&lt;SPAN&gt; Data will be ingested from this layer in batch or real-time using various ingestion tools or Databricks’ native services (e.g., Autoloader, DLT, etc.)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Raw Data Layer (Bronze)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Ingestion&lt;/STRONG&gt;&lt;SPAN&gt;: Data will be ingested from the landing data layer and stored as of the data source with delta format&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Delta Lake:&lt;/STRONG&gt;&lt;SPAN&gt; Ensures ACID transactions, schema enforcement, and unified handling of batch and streaming data&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;STRONG&gt; Curated Data Layer (Silver)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Transformation:&lt;/STRONG&gt;&lt;SPAN&gt; Data is cleaned, enriched, and transformed within Databricks.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Quality Check&lt;/STRONG&gt;&lt;SPAN&gt;: Data will be checked against specific data quality rules to ensure quality standards are met&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Integration:&lt;/STRONG&gt;&lt;SPAN&gt; the data from multiple sources could be integrated and consolidated for common use cases&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;STRONG&gt; Consumption Data Layer (Gold)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Modeling: &lt;/STRONG&gt;&lt;SPAN&gt;Data are modelled for semantic consistency and read performance (e.g. Dimensional Modeling or denormalized)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;SQL Analytics and BI Tools:&lt;/STRONG&gt;&lt;SPAN&gt; Databricks DBSQL or BI tools will access the data in layers for visualization or quick insights&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;The ETL framework and the Lakehouse require governance, security control, and monitoring capabilities across all layers.&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Data Governance:&lt;/STRONG&gt;&lt;SPAN&gt; Unity Catalog provides centralized governance, access control, and data lineage.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Monitoring and Optimization:&lt;/STRONG&gt;&lt;SPAN&gt; Built-in tools for job monitoring, resource management, and performance optimization.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ETL_Framework - E2EDesign (1).png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11920iF79567AF05C0232C/image-size/large?v=v2&amp;amp;px=999" role="button" title="ETL_Framework - E2EDesign (1).png" alt="ETL_Framework - E2EDesign (1).png" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;&lt;SPAN&gt;Metadata Driven Framework design&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;The framework can have multiple key components that are responsible for building each layer in the lakehouse architecture.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Control tables&lt;/STRONG&gt;&lt;SPAN&gt; are the configuration required for specific ETL pipelines. The structure and model of the control tables and the approach of the execution notebooks change based on the tasks in the different layers (Bronze, Silver, Gold).&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG&gt;Execution scripts/notebooks&lt;/STRONG&gt;&lt;SPAN&gt; leverage the configurations from the control tables to the execution&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;STRONG style="color: #1b3139; font-family: inherit;"&gt;Log tables&lt;/STRONG&gt;&lt;SPAN&gt; or the job-run audit tables provide complete audit and traceability of the job runs.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;SPAN&gt;&lt;STRONG&gt;Data Model&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ETL_Framework_ER.jpeg" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11873i2B7E96C8DCB16BF3/image-size/large?v=v2&amp;amp;px=999" role="button" title="ETL_Framework_ER.jpeg" alt="ETL_Framework_ER.jpeg" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&lt;STRONG&gt;Bronze&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;This is the layer where data is ingested in its original form. There are three key components to build the backbone of the bronze layer loading process: Bronze Control Tables, Generic Python Modules to load the bronze layer tables, and the workflow job to orchestrate the pipeline.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;All the required configuration parameters are stored in the control table, and in the execution notebook, these parameters are passed to feed the autoloader process to load the bronze tables.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;BRONZE_CONTROL_TABLE&amp;nbsp;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;This table holds the configuration details to load the bronze layer table; SCD type-2 is maintained by upserting new/updated records.&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE class="lia-align-left" style="height: 550px; width: 670px; border-style: solid; border-color: teal; background-color: light grey;" border="2"&gt;&lt;CAPTION&gt;&amp;nbsp;&lt;/CAPTION&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px" style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;FONT color="#333333"&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px" style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;FONT color="#333333"&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;id&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;Unique and incremental autogenerated surrogate key&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;source_system&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;Source system name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;bronze_table_name&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;Table name&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;bronze_schema_name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;Bronze layer schema name&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;source_file_type&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;The format of the source/raw files&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;file_location&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;The full path of the source file location&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;config_file_name&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;yaml file which is &lt;/SPAN&gt;&lt;SPAN&gt;used to add the configuration&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;record_start_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;scd type2 record start date time&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;record_end_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;scd type2 record end date time&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="173.766px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;record_is_active&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="389.023px" height="50px"&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;SPAN&gt;scd type2 record active flag&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Generic Python execution modules&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;The execution notebook is invoked by various job tasks with specific parameters to access particular bronze tables. The execution notebook is designed to be reused and parameterized and serves as a generic program that can take in parameters from the workflow job tasks and use different modules to execute tasks like getting configuration details from the control tables and loading the bronze tables with auto-loader&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="bronze.jpg" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11666i45C7124272A7EB56/image-size/large?v=v2&amp;amp;px=999" role="button" title="bronze.jpg" alt="bronze.jpg" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&lt;STRONG&gt;Silver&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;In this layer, data quality checks and SCD1/2 loading are applied based on control table mappings. Records failing the checks are stored in quarantine tables, and depending on severity (e.g., "Drop" skips the record, while "Warning" allows it), they may or may not be loaded into the silver tables.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;There are three key components to build the backbone of the Silver layer loading process:&lt;/SPAN&gt;&lt;STRONG&gt; DQ Control Tables (DQ and Silver layer mapping), Generic Python Modules to do DQ checks and load the silver layer tables, and the workflow job to orchestrate the pipeline.&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Silver layer control table structure&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;SILVER_CONTROL_TABLE&amp;nbsp;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;This table holds the configuration detail to load the silver layer tables, SCD type2 is maintained by upserting new/updated records.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE class=" lia-align-left" style="border-style: solid; border-color: teal; background-color: light grey;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background-color: pink; border-style: solid;"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="background-color: pink; border-style: solid;"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;id&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Unique and incremental autogenerated surrogate key&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;source_schema_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;source table’s schema name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;silver_schema_name&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Silver layer schema name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;load_type&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;The approach to loading the silver layer tables&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;config_file_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;yaml file which is &lt;/SPAN&gt;&lt;SPAN&gt;used to add the configuration&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_start_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record start date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_end_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record end date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_is_active&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record active flag&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;DQ_RULES&lt;/STRONG&gt;&lt;SPAN&gt; - This table is used as the rule registry where all the rules are defined along with the different configurations. Rule_ID needs to be unique and explicitly declared while creating new rule. SCD type2 is maintained while updating or inserting any new rules.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE style="height: 483px; border-style: solid;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border-style: solid; background-color: pink;" width="136.414px" height="33px"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border-style: solid; background-color: pink;" width="534.859px" height="33px"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;id&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;Unique and incremental autogenerated surrogate key&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;rule_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;a unique id explicitly declared in the configuration while creating new rules&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;rule_type&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;type of the rules -sql or function&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;rule&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;for sql it’s the entire sql clause, for function just the function name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;description&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;rule description&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;config_file_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;yaml file which is &lt;/SPAN&gt;&lt;SPAN&gt;used to add the configuration&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;record_start_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record start date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;record_end_ts&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record end date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="136.414px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;record_is_active&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="534.859px" height="50px"&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record active flag&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;DQ_RULES_ASSIGNMENT &lt;/STRONG&gt;&lt;SPAN&gt;- This table records the rule assignment to the particular columns of the tables. The ID is automatically generated based on the combination of the table, column and the rule_id. SCD type2 is maintained while updating or inserting any new record.&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Unique and incremental autogenerated surrogate key&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Name of the table whose column is getting dq checked&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;column_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Name of the column which is getting dq checked&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;rule_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;rule_id of the rule from the DQ_RULES table&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;severity&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Type of the severity of the technical DQ check fail outcome.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;config_file_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;yaml file which is &lt;/SPAN&gt;&lt;SPAN&gt;used to add the configuration&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_start_ts&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record start date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_end_ts&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record end date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_is_active&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record active flag&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Generic Python execution modules&amp;nbsp;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;The execution notebook is invoked by various job tasks with specific parameters to access particular silver tables. The execution notebook is a generic program that can take in parameters from the workflow job tasks and use different modules to execute tasks like getting configuration detail from the control tables, performing data quality checks, and loading silver tables with the right loading approach.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="silver.jpg" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11667i63A2A02F0EC25CAB/image-size/large?v=v2&amp;amp;px=999" role="button" title="silver.jpg" alt="silver.jpg" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&lt;STRONG&gt;Gold&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;In this layer, the primary focus is on data transformation, where records are mapped to the correct attributes according to a specific data modelling methodology. For instance, in our case, we are using dimensional modelling, and building dimensions and facts as the gold layer tables sourcing from the silver layer tables.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This process also has three key components:&lt;/SPAN&gt;&lt;STRONG&gt; Gold Control Tables, a Transformation notebook, and the workflow job to orchestrate the pipeline.&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;GOLD_CONTROL_TABLE&amp;nbsp;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;This table holds the configuration detail to load the gold layer tables, SCD type2 is maintained by upserting new/updated records&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;id&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Unique and incremental autogenerated surrogate key&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;schema_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target table schema name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target table name which is built from the transformation&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;notebook_name&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Transformation notebook&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;config_file_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;yaml file which is &lt;/SPAN&gt;&lt;SPAN&gt;used to add the configuration&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_start_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record start date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_end_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record end date time&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;record_is_active&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;scd type2 record active flag&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Generic Python execution modules&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rjt_de_0-1728912001867.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11910i02879F2D36909DA2/image-size/large?v=v2&amp;amp;px=999" role="button" title="Rjt_de_0-1728912001867.png" alt="Rjt_de_0-1728912001867.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&lt;STRONG&gt;Audit Tables&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;Audit tables in an ETL framework are essential for tracking the success, failure, and performance of data processes, ensuring data integrity and transparency. They provide crucial logging information for troubleshooting and compliance, facilitating better monitoring and control of ETL workflows&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;DQ_Run_Audit table -&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;This audit table is to track and record all the data quality check results of each batch in the silver layer during the data curation process-&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE style="border-style: solid; border-color: teal;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;batch_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Master workflow job run id which is a unique identifier&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;dq_task_run_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;DQ pipeline run id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;source_schema_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table schema name which goes under the DQ check&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;table name which goes under the DQ check&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target_schema_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target table schema name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;pipeline_status&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;data quality pipeline status&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;dq_check_outcome&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;to identify any quarantine records found or not&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;src_rec_count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;source table record count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;quarantine_count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;quarantined record count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target_rec_count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;target table record count&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;dq_task_start_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;data quality check start timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;dq_task_end_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;data quality check end timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Job_Run_Audit table&amp;nbsp;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN&gt;This table is for tracking the status of all job runs across different ETL layers. The table can be further modelled to capture granularity at the task level.&lt;/SPAN&gt;&lt;/P&gt;
&lt;TABLE style="border-style: solid; border-color: teal;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Columns&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;TH style="border-style: solid; background-color: pink;"&gt;
&lt;P&gt;&lt;STRONG&gt;Description&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;job_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Job id of the workflow jobs&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;job_name&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;name of the job&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;job_run_id&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Workflow job run id&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;layer&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Data layer&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;job_status&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;Table load pipeline status&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;task_start_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;data quality check start timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;task_end_timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;SPAN&gt;data quality check end timestamp&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H1&gt;&lt;SPAN&gt;User Journey&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;An ETL framework should prioritize developer efficiency and rapid integration of new features or data sources. In this framework, there are two personas responsible for building the entire ETL process. Framework development involves building the foundation, which may undergo changes to add new capabilities like DQ rules, enhance auditing details, or improve functionality. The application developers work on multiple iterations to build new data pipelines. This involves ingesting new metadata into the control tables, which will then be used to build or update the bronze, silver and gold layer pipelines. Additionally, the developer will create transformation notebooks in the Gold layer.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cuj1.jpg" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11669i6CDA50FCB91CCEDC/image-size/large?v=v2&amp;amp;px=999" role="button" title="cuj1.jpg" alt="cuj1.jpg" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;&lt;STRONG&gt;Framework Developer’s responsibilities&lt;/STRONG&gt;&lt;/H2&gt;
&lt;OL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create and maintain the generic Bronze/Silver/Gold loader notebooks&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create and maintain modular utility methods to support repetitive tasks in the framework, such as autoloader-based bronze loading, data quality check, implementing SCD etc.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create and maintain the control table data model.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create and maintain pipelines to populate control tables from YML files, which will be used in the CI-CD pipeline.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="framework_dev_cuj.jpg" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11671i0513A9C32EE043EF/image-size/large?v=v2&amp;amp;px=999" role="button" title="framework_dev_cuj.jpg" alt="framework_dev_cuj.jpg" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;&lt;STRONG&gt;Application Developer’s responsibilities&lt;/STRONG&gt;&lt;/H2&gt;
&lt;OL&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create individual YML files for bronze_control, silver_control, dq_rules_assignment, and gold_control. A separate pipeline will ingest all these YML files into the control tables.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style="font-weight: 400;" aria-level="1"&gt;&lt;SPAN&gt;Create transformation notebooks for the Gold layer tables.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="app_dev_cuj.jpg" style="width: 710px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11672i2829EBF50EC25B90/image-size/large?v=v2&amp;amp;px=999" role="button" title="app_dev_cuj.jpg" alt="app_dev_cuj.jpg" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;H1&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;In this part, we covered the key factors to consider while designing the ETL framework, including the standard architecture, metadata model (the framework's backbone), and the developer's journey in building and maintaining it. While variations may exist to suit specific project needs, this serves as a reference architecture to guide the creation of a scalable, robust ETL framework.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In part 2, we'll explore orchestration and how it supports the framework-driven ETL architecture, seamlessly integrating with a standard CI/CD pipeline.&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 21 Oct 2024 08:09:27 GMT</pubDate>
    <dc:creator>Rjt_de</dc:creator>
    <dc:date>2024-10-21T08:09:27Z</dc:date>
    <item>
      <title>Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/ba-p/92666</link>
      <description>&lt;P&gt;&lt;SPAN&gt;In modern data-driven enterprises, data flows like lifeblood through complex systems and repositories to drive decision-making and innovation. Each dataset, whether structured or unstructured, holds the potential to unlock insights and drive innovation. However, transforming raw data into actionable intelligence is a complex challenge that demands a dynamic, adaptable framework capable of accelerating data ingestion and transformation.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In this three-part blog, we will cover the metadata setup (part 1), orchestration (part 2), and deployment process (part 3) of a configuration/metadata-driven ETL framework in Databricks following the Lakehouse architecture.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 21 Oct 2024 08:09:27 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/ba-p/92666</guid>
      <dc:creator>Rjt_de</dc:creator>
      <dc:date>2024-10-21T08:09:27Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96020#M337</link>
      <description>&lt;P&gt;Excited to see the second part.&lt;/P&gt;</description>
      <pubDate>Thu, 24 Oct 2024 16:54:05 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96020#M337</guid>
      <dc:creator>camrojas</dc:creator>
      <dc:date>2024-10-24T16:54:05Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96396#M339</link>
      <description>&lt;P&gt;Great stuff. Waiting for part 2&lt;/P&gt;</description>
      <pubDate>Mon, 28 Oct 2024 07:55:11 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96396#M339</guid>
      <dc:creator>ArunPrasanthS</dc:creator>
      <dc:date>2024-10-28T07:55:11Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96973#M349</link>
      <description>&lt;P&gt;I'm eagerly awating the next part.&amp;nbsp; I do have some questions that I hope will get addressed, or maybe someone can share some insights on.&lt;/P&gt;&lt;P&gt;1. Are the framework tables stored as Delta tables in the lakehouse?&amp;nbsp; I envision a seperate config schema that would house these tables, but I haven't worked with ingesting YAML files before so a bit confused on this point.&lt;/P&gt;&lt;P&gt;2. Will there be sample code showing a potential implementation of the generic execution notebooks?&amp;nbsp; I am very much interested in how the audit tables get populated at run time with the statistics.&amp;nbsp; We homebrewed an ETL monitoring system that relies on orchestration from Azure Data Factory, and I am hoping to be able to replace that with something more streamlined.&lt;/P&gt;&lt;P&gt;3. The article mentioned a separate pipeline to ingest the YAML files - is that planned for a future part of this series?&amp;nbsp; I've tried searching the community forums but haven't been able to find much information on this, so I hope it is covered.&lt;/P&gt;&lt;P&gt;Excellent article, and I am excited to see what I can learn from the future parts so that I can apply them to my ETL environment.&lt;/P&gt;</description>
      <pubDate>Thu, 31 Oct 2024 11:30:16 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96973#M349</guid>
      <dc:creator>JesseS</dc:creator>
      <dc:date>2024-10-31T11:30:16Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96993#M351</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Thanks, it looks great!&lt;/P&gt;&lt;P class=""&gt;Do you have any code or repository examples to share? We implemented a similar approach, and we also added some metadata, such as PII table identifiers and additional table properties, to our configuration.&lt;/P&gt;</description>
      <pubDate>Thu, 31 Oct 2024 13:22:05 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/96993#M351</guid>
      <dc:creator>h_h_ak</dc:creator>
      <dc:date>2024-10-31T13:22:05Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/97771#M360</link>
      <description>&lt;P&gt;Nice article ... eagerly waiting for part-2&lt;/P&gt;</description>
      <pubDate>Tue, 05 Nov 2024 14:48:28 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/97771#M360</guid>
      <dc:creator>AjayVerma</dc:creator>
      <dc:date>2024-11-05T14:48:28Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/98908#M377</link>
      <description>&lt;P&gt;I'm just going to repeat what was said before, good article .......really, eagerly waiting for the follow up.&lt;/P&gt;&lt;P&gt;No pressure&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":grinning_face:"&gt;😀&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 15 Nov 2024 10:44:48 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/98908#M377</guid>
      <dc:creator>Mario_D</dc:creator>
      <dc:date>2024-11-15T10:44:48Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/98973#M378</link>
      <description>&lt;P&gt;Great article. Can't wait for second part! &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 15 Nov 2024 16:38:37 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/98973#M378</guid>
      <dc:creator>szymon_dybczak</dc:creator>
      <dc:date>2024-11-15T16:38:37Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/104846#M428</link>
      <description>&lt;P&gt;Nice article, we have built simlar frameworks. Waiting for the next part.&lt;/P&gt;</description>
      <pubDate>Thu, 09 Jan 2025 06:39:27 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/104846#M428</guid>
      <dc:creator>ptambe</dc:creator>
      <dc:date>2025-01-09T06:39:27Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/105679#M435</link>
      <description>&lt;P&gt;I feel that the challenges will be far more due to the limitations of the workflow &amp;amp; Databricks. For example- How to install the libraries dynamically to the cluster etc.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And also this type of framework should not be called as ETL framework. Because it will not work for all the use cases.&amp;nbsp;&lt;BR /&gt;At best you can separate it out and call it Orchestration Framework because you can not drive the transformations through the metadata. You can only orchestrate your notebooks through a framework (including few key details like table names and stuff.)&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 15 Jan 2025 08:50:58 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/105679#M435</guid>
      <dc:creator>warlord</dc:creator>
      <dc:date>2025-01-15T08:50:58Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/106387#M438</link>
      <description>&lt;P&gt;Does it design relate to the implementation provided here: &lt;A href="https://github.com/databrickslabs/dlt-meta?tab=readme-ov-file" target="_blank"&gt;https://github.com/databrickslabs/dlt-meta?tab=readme-ov-file&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Databricks team has already published this library dlt-meta . I am trying to understand how this design discussion correlates to what is in that repo ?&lt;/P&gt;&lt;P&gt;Can anyone provide any suggestions here ?&lt;/P&gt;</description>
      <pubDate>Tue, 21 Jan 2025 01:36:25 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/106387#M438</guid>
      <dc:creator>CuriousExplorer</dc:creator>
      <dc:date>2025-01-21T01:36:25Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/106433#M439</link>
      <description>&lt;P&gt;Interesting,&lt;/P&gt;&lt;P&gt;but I start to get the feeling that this might be overengineered.&lt;BR /&gt;A framework like this is almost a classic DWH with a ton of control/system tables and saving/controlling state.&lt;BR /&gt;Coming from classic data warehousing, this is not where I want to end up again.&lt;/P&gt;&lt;P&gt;But that might just be me.&lt;/P&gt;</description>
      <pubDate>Tue, 21 Jan 2025 10:28:11 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/106433#M439</guid>
      <dc:creator>-werners-</dc:creator>
      <dc:date>2025-01-21T10:28:11Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107450#M446</link>
      <description>&lt;P&gt;Really great article!&amp;nbsp; Any timing on your Part 2 article??&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jan 2025 17:22:29 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107450#M446</guid>
      <dc:creator>BradSheridan</dc:creator>
      <dc:date>2025-01-28T17:22:29Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107558#M447</link>
      <description>&lt;P&gt;Indeed very promissing article. Why are the other two part of this blog?&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jan 2025 11:05:53 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107558#M447</guid>
      <dc:creator>WiseBrick</dc:creator>
      <dc:date>2025-01-29T11:05:53Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107574#M448</link>
      <description>&lt;P&gt;Great breakdown of the ETL framework design! The emphasis on modularity, scalability, and auditability is spot on for building a robust data pipeline. I'm excited to see how orchestration will enhance the architecture in part 2!&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jan 2025 12:00:43 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/107574#M448</guid>
      <dc:creator>jonsan</dc:creator>
      <dc:date>2025-01-29T12:00:43Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/108514#M450</link>
      <description>&lt;P&gt;This is a fantastic post! The &lt;STRONG&gt;Metadata-Driven ETL Framework&lt;/STRONG&gt; is a powerful approach to making data pipelines more &lt;STRONG&gt;scalable, efficient, and easier to manage&lt;/STRONG&gt; within Databricks. The structured metadata-driven execution reduces manual intervention and enhances governance, which is critical for enterprise-scale ETL processes.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Few Questions:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Scalability and Performance:&lt;/STRONG&gt; How does the framework address performance optimization, especially for large datasets and complex transformations? Are there specific techniques or tools used to ensure efficient processing?&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Error Handling and Logging:&lt;/STRONG&gt; What mechanisms are in place for error handling and logging within the framework? How are errors captured, reported, and addressed to ensure data integrity and pipeline resilience?&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Data Lineage and Governance:&lt;/STRONG&gt; How does the framework support data lineage tracking and governance processes? Can users easily trace the origin and transformations of data within the pipelines?&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Integration with Databricks Features:&lt;/STRONG&gt; How does the framework leverage Databricks features like Delta Live Tables (DLT) or Databricks SQL for data quality and transformation tasks?&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Maintenance and Updates:&lt;/STRONG&gt; How is the framework maintained and updated? Is there a process for incorporating new features, bug fixes, and enhancements?&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;I truly appreciate the depth of knowledge shared in this post and look forward to learning more about the real-world applications of this framework. Thanks for this insightful piece!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2025 06:37:07 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/108514#M450</guid>
      <dc:creator>Mantsama4</dc:creator>
      <dc:date>2025-02-03T06:37:07Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/109043#M455</link>
      <description>&lt;P&gt;Comment to back with the second part.&lt;/P&gt;</description>
      <pubDate>Thu, 06 Feb 2025 01:14:34 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/109043#M455</guid>
      <dc:creator>CARAQUE</dc:creator>
      <dc:date>2025-02-06T01:14:34Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/109231#M456</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/144587"&gt;@CuriousExplorer&lt;/a&gt;&amp;nbsp;I too have the same exact question.&amp;nbsp; Have you gotten any additional insight?&lt;/P&gt;</description>
      <pubDate>Thu, 06 Feb 2025 15:12:03 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/109231#M456</guid>
      <dc:creator>BradSheridan</dc:creator>
      <dc:date>2025-02-06T15:12:03Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/110040#M470</link>
      <description>&lt;P&gt;It is a great article, I am excited for the next parts.&lt;/P&gt;&lt;P&gt;I am not sure about having these metadata tables in the lakehouse. It forces us to build a data pipeline for the metadata table. Isn't it better to just use a transactional database like mongo or postgres for it and let CICD pipeline fill them?&lt;/P&gt;</description>
      <pubDate>Wed, 12 Feb 2025 20:04:41 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/110040#M470</guid>
      <dc:creator>Flaviodiasps</dc:creator>
      <dc:date>2025-02-12T20:04:41Z</dc:date>
    </item>
    <item>
      <title>Re: Metadata-Driven ETL Framework in Databricks (Part-1)</title>
      <link>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/111434#M479</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/23348"&gt;@DataBricks&lt;/a&gt;. When could we expect the next parts ?&lt;/P&gt;</description>
      <pubDate>Fri, 28 Feb 2025 09:22:04 GMT</pubDate>
      <guid>https://community.databricks.com/t5/technical-blog/metadata-driven-etl-framework-in-databricks-part-1/bc-p/111434#M479</guid>
      <dc:creator>WiseBrick</dc:creator>
      <dc:date>2025-02-28T09:22:04Z</dc:date>
    </item>
  </channel>
</rss>

