<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Databricks Data Ingestion in Get Started Discussions</title>
    <link>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167272#M12066</link>
    <description>&lt;P&gt;Yes, having a generic, parameter-driven ingestion architecture is the standard enterprise design pattern in Databricks to avoid managing dozens of redundant pipelines.&lt;BR /&gt;However, how you achieve this depends on whether you are using Custom Spark/Delta Lake Pipelines or Databricks Lakeflow Connect (Managed Ingestion).&lt;BR /&gt;Use Case Breakdown &amp;amp; Feasibility&lt;BR /&gt;Use Case 1: Editing a pipeline to ingest new tables (table_3, table_4)&lt;BR /&gt;• Yes, this is fully supported. You do not need to build a new pipeline for new tables. You update your central configuration file (YAML/JSON) or configuration table to register table_3 and table_4.&lt;BR /&gt;• When the pipeline triggers, it dynamically reads the updated configuration, instantiates the flows for table_3 and table_4, and ingests them alongside or independently of existing tables.&lt;BR /&gt;Use Case 2: Using the same pipeline for 50 different Database Servers&lt;BR /&gt;• Yes, but with an architectural nuance:&lt;BR /&gt;o A single pipeline can loop through or accept dynamic connections if configured as a parameter-driven job.&lt;BR /&gt;o However, for scaling across 50 database servers, the best practice is One Generic Codebase/Template deployed to 50 Pipeline Jobs (via CI/CD or Databricks Asset Bundles) rather than forcing 50 servers sequentially into a single massive execution run.&lt;BR /&gt;Architecture Approaches in Databricks&lt;BR /&gt;Depending on how your ingestion is built, here are the two main ways to implement this:&lt;BR /&gt;Approach 1: Generic Databricks Declarative Pipeline / PySpark Framework (Best for Metadata-Driven Ingestion)&lt;BR /&gt;Rather than hardcoding table names or source servers in Python or SQL scripts, your code queries a central Metadata Config (YAML file or Delta Table).&lt;BR /&gt;1. Define your Configuration (ingestion_config.yaml):&lt;BR /&gt;YAML&lt;BR /&gt;sources:&lt;BR /&gt;- connection_name: "sql_server_east"&lt;BR /&gt;jdbc_url: "jdbc:sqlserver://server01.database.windows.net:1433;database=Sales"&lt;BR /&gt;secret_scope: "db_secrets"&lt;BR /&gt;secret_key: "server01_password"&lt;BR /&gt;tables:&lt;BR /&gt;- source_table: "dbo.Orders"&lt;BR /&gt;target_table: "bronze_orders"&lt;BR /&gt;primary_key: "OrderID"&lt;BR /&gt;- source_table: "dbo.Customers"&lt;BR /&gt;target_table: "bronze_customers"&lt;BR /&gt;primary_key: "CustomerID"&lt;BR /&gt;2. Dynamic Ingestion Engine (generic_ingest.py): Similar to below snap&lt;BR /&gt;Python&lt;BR /&gt;import yaml&lt;BR /&gt;from pyspark.sql import SparkSession&lt;/P&gt;&lt;P&gt;# Read YAML config from Workspace or DBFS/Volume&lt;BR /&gt;with open("/Volumes/main/default/configs/ingestion_config.yaml", "r") as f:&lt;BR /&gt;config = yaml.safe_load(f)&lt;/P&gt;&lt;P&gt;for source in config["sources"]:&lt;BR /&gt;db_password = dbutils.secrets.get(scope=source["secret_scope"], key=source["secret_key"])&lt;BR /&gt;&lt;BR /&gt;for table_info in source["tables"]:&lt;BR /&gt;# Dynamic JDBC Read&lt;BR /&gt;df = (spark.read.format("jdbc")&lt;BR /&gt;.option("url", source["jdbc_url"])&lt;BR /&gt;.option("dbtable", table_info["source_table"])&lt;BR /&gt;.option("password", db_password)&lt;BR /&gt;.load())&lt;BR /&gt;&lt;BR /&gt;# Write dynamically to Target Bronze Delta Table&lt;BR /&gt;df.write.format("delta").mode("append").saveAsTable(f"bronze.{table_info['target_table']}")&lt;BR /&gt;• To add table_3 and table_4: Simply append them to the YAML file. The next run will automatically pick them up without code changes.&lt;BR /&gt;• To handle multiple servers: Add a new entry under sources in the YAML, or pass the server_name as a Job Parameter (dbutils.widgets.get("server_name")) to reuse the single notebook for multiple runs.&lt;BR /&gt;Approach 2: Databricks Lakeflow Connect (Managed Ingestion)&lt;BR /&gt;If you are using Lakeflow Connect (Databricks' native managed change data capture / database connector feature):&lt;BR /&gt;1. Table Changes (Use Case 1): You can edit an existing Lakeflow managed ingestion pipeline directly via the UI, Databricks CLI, or Declarative Automation Bundles (DABs). Adding new tables to the pipeline config will trigger an initial snapshot for the new tables while keeping the existing tables running incrementally.&lt;BR /&gt;2. Multiple Servers (Use Case 2): Lakeflow managed ingestion requires a Unity Catalog Connection per database server.&lt;BR /&gt;o A single Lakeflow Ingestion Gateway &amp;amp; Pipeline is bound to one source connection (one database server).&lt;BR /&gt;o Recommendation: Use Databricks Asset Bundles (DABs) to define a single declarative template (in YAML). You then parameterize the connection name and deploy 50 small, isolated server pipelines automatically via CI/CD. This prevents one failing database server from crashing the ingestion of the other 49 servers.&lt;/P&gt;</description>
    <pubDate>Wed, 02 Sep 2026 10:01:57 GMT</pubDate>
    <dc:creator>Satyasai</dc:creator>
    <dc:date>2026-09-02T10:01:57Z</dc:date>
    <item>
      <title>Databricks Data Ingestion</title>
      <link>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167261#M12064</link>
      <description>&lt;P&gt;Hi all,&lt;BR /&gt;&lt;BR /&gt;I am currently exploring the data ingestion feature offered by databricks, specifically connecting to a SQL server.&amp;nbsp;&lt;BR /&gt;I have gone through the UI and configured an ingestion pipeline that connects to one specific server and can read tables into databricks.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am currently venturing into understanding if we can make an ingestion pipeline dynamic.&lt;/P&gt;&lt;P&gt;What I mean by this is, I have created a yaml file that can be run to setup an ingestion pipeline. It accepts variables from a metadata config table that can be used to populate the YAML with information such as, connection server name, pipeline name, source catalog, source schema, source table, destination catalog, destination schema and destination table name.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;So the question I have is, can we have a generic pipeline whose configurations can be altered?&amp;nbsp;&lt;BR /&gt;Use cases:&lt;BR /&gt;1. Once a pipeline is created can it be edited in the future to ingest different tables? As in using pipeline_01, I ingested table_1, table_2 present in Server_01. Can I later pass different configs to the YAML such that I use the same pipeline_01 to ingest table_03, table_04?&lt;/P&gt;&lt;P&gt;2. Can I use pipeline_01 to connect to a different to a connection server and ingest tables from this new server?&lt;/P&gt;&lt;P&gt;Currently I am not finding a way to achieve this functionality. This will cause an issue in the future when I have say 50 servers. It will be difficult to maintain 50 different pipelines and I don't think this is desirable as well.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Can I get some insights into Data Ingestion feature and if this a viable option for my use case?&lt;BR /&gt;&lt;BR /&gt;Thank you,&lt;BR /&gt;Anush&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 02 Sep 2026 09:09:04 GMT</pubDate>
      <guid>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167261#M12064</guid>
      <dc:creator>anushnagesh</dc:creator>
      <dc:date>2026-09-02T09:09:04Z</dc:date>
    </item>
    <item>
      <title>Re: Databricks Data Ingestion</title>
      <link>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167269#M12065</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/250293"&gt;@anushnagesh&lt;/a&gt;&amp;nbsp;Updating an existing pipeline to ingest different tables from the same SQL Server instance is fully supported. You can dynamically modify the target tables by updating the objects block inside the pipeline's ingestion_definition. This change can be applied directly via the Pipelines API, the CLI (databricks pipelines update) or by updating and redeploying the Declarative Automation Bundles DAB YAML configuration. If you configure schema-level ingestion rather than specifying individual tables, the pipeline automatically detects and replicates new tables added to that schema without requiring any configuration updates.&lt;/P&gt;&lt;P&gt;Connecting a single pipeline across multiple SQL Server instances is generally not possible. In this ingestion architecture, each &lt;STRONG&gt;ingestion gateway&lt;/STRONG&gt; is bound to a &lt;STRONG&gt;single&lt;/STRONG&gt; Unity Catalog connection via gateway_definition.connection_name and each connection maps directly to one specific SQL Server instance. The ingestion pipeline inherits this connection via ingestion_definition.ingestion_gateway_id. Each ingestion pipeline is associated with exactly one ingestion gateway and gateways cannot be generally shared across pipelines. More details &lt;A href="https://docs.databricks.com/aws/en/ingestion/lakeflow-connect/sql-server-limits" target="_self"&gt;here&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1:1&lt;/STRONG&gt; server-to-pipeline model &lt;STRONG&gt;scales&lt;/STRONG&gt; cleanly using Declarative Automation Bundles (DABs). Your approach of driving parameterized YAML configurations from a metadata table fits this pattern well, allowing you to version-control and deploy all 50 pipelines across development, staging, and production environments with a single CLI command. If you want to streamline this footprint, you can check the new &lt;STRONG&gt;Integrated CDC&lt;/STRONG&gt; architecture which merges the gateway and ingestion pipeline into a single pipeline per server eliminating the cost and maintenance of continuously running gateway compute. More details &lt;A href="https://docs.databricks.com/aws/en/ingestion/lakeflow-connect/sql-server-integrated-pipeline" target="_self"&gt;here&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 02 Sep 2026 09:45:02 GMT</pubDate>
      <guid>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167269#M12065</guid>
      <dc:creator>balajij8</dc:creator>
      <dc:date>2026-09-02T09:45:02Z</dc:date>
    </item>
    <item>
      <title>Re: Databricks Data Ingestion</title>
      <link>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167272#M12066</link>
      <description>&lt;P&gt;Yes, having a generic, parameter-driven ingestion architecture is the standard enterprise design pattern in Databricks to avoid managing dozens of redundant pipelines.&lt;BR /&gt;However, how you achieve this depends on whether you are using Custom Spark/Delta Lake Pipelines or Databricks Lakeflow Connect (Managed Ingestion).&lt;BR /&gt;Use Case Breakdown &amp;amp; Feasibility&lt;BR /&gt;Use Case 1: Editing a pipeline to ingest new tables (table_3, table_4)&lt;BR /&gt;• Yes, this is fully supported. You do not need to build a new pipeline for new tables. You update your central configuration file (YAML/JSON) or configuration table to register table_3 and table_4.&lt;BR /&gt;• When the pipeline triggers, it dynamically reads the updated configuration, instantiates the flows for table_3 and table_4, and ingests them alongside or independently of existing tables.&lt;BR /&gt;Use Case 2: Using the same pipeline for 50 different Database Servers&lt;BR /&gt;• Yes, but with an architectural nuance:&lt;BR /&gt;o A single pipeline can loop through or accept dynamic connections if configured as a parameter-driven job.&lt;BR /&gt;o However, for scaling across 50 database servers, the best practice is One Generic Codebase/Template deployed to 50 Pipeline Jobs (via CI/CD or Databricks Asset Bundles) rather than forcing 50 servers sequentially into a single massive execution run.&lt;BR /&gt;Architecture Approaches in Databricks&lt;BR /&gt;Depending on how your ingestion is built, here are the two main ways to implement this:&lt;BR /&gt;Approach 1: Generic Databricks Declarative Pipeline / PySpark Framework (Best for Metadata-Driven Ingestion)&lt;BR /&gt;Rather than hardcoding table names or source servers in Python or SQL scripts, your code queries a central Metadata Config (YAML file or Delta Table).&lt;BR /&gt;1. Define your Configuration (ingestion_config.yaml):&lt;BR /&gt;YAML&lt;BR /&gt;sources:&lt;BR /&gt;- connection_name: "sql_server_east"&lt;BR /&gt;jdbc_url: "jdbc:sqlserver://server01.database.windows.net:1433;database=Sales"&lt;BR /&gt;secret_scope: "db_secrets"&lt;BR /&gt;secret_key: "server01_password"&lt;BR /&gt;tables:&lt;BR /&gt;- source_table: "dbo.Orders"&lt;BR /&gt;target_table: "bronze_orders"&lt;BR /&gt;primary_key: "OrderID"&lt;BR /&gt;- source_table: "dbo.Customers"&lt;BR /&gt;target_table: "bronze_customers"&lt;BR /&gt;primary_key: "CustomerID"&lt;BR /&gt;2. Dynamic Ingestion Engine (generic_ingest.py): Similar to below snap&lt;BR /&gt;Python&lt;BR /&gt;import yaml&lt;BR /&gt;from pyspark.sql import SparkSession&lt;/P&gt;&lt;P&gt;# Read YAML config from Workspace or DBFS/Volume&lt;BR /&gt;with open("/Volumes/main/default/configs/ingestion_config.yaml", "r") as f:&lt;BR /&gt;config = yaml.safe_load(f)&lt;/P&gt;&lt;P&gt;for source in config["sources"]:&lt;BR /&gt;db_password = dbutils.secrets.get(scope=source["secret_scope"], key=source["secret_key"])&lt;BR /&gt;&lt;BR /&gt;for table_info in source["tables"]:&lt;BR /&gt;# Dynamic JDBC Read&lt;BR /&gt;df = (spark.read.format("jdbc")&lt;BR /&gt;.option("url", source["jdbc_url"])&lt;BR /&gt;.option("dbtable", table_info["source_table"])&lt;BR /&gt;.option("password", db_password)&lt;BR /&gt;.load())&lt;BR /&gt;&lt;BR /&gt;# Write dynamically to Target Bronze Delta Table&lt;BR /&gt;df.write.format("delta").mode("append").saveAsTable(f"bronze.{table_info['target_table']}")&lt;BR /&gt;• To add table_3 and table_4: Simply append them to the YAML file. The next run will automatically pick them up without code changes.&lt;BR /&gt;• To handle multiple servers: Add a new entry under sources in the YAML, or pass the server_name as a Job Parameter (dbutils.widgets.get("server_name")) to reuse the single notebook for multiple runs.&lt;BR /&gt;Approach 2: Databricks Lakeflow Connect (Managed Ingestion)&lt;BR /&gt;If you are using Lakeflow Connect (Databricks' native managed change data capture / database connector feature):&lt;BR /&gt;1. Table Changes (Use Case 1): You can edit an existing Lakeflow managed ingestion pipeline directly via the UI, Databricks CLI, or Declarative Automation Bundles (DABs). Adding new tables to the pipeline config will trigger an initial snapshot for the new tables while keeping the existing tables running incrementally.&lt;BR /&gt;2. Multiple Servers (Use Case 2): Lakeflow managed ingestion requires a Unity Catalog Connection per database server.&lt;BR /&gt;o A single Lakeflow Ingestion Gateway &amp;amp; Pipeline is bound to one source connection (one database server).&lt;BR /&gt;o Recommendation: Use Databricks Asset Bundles (DABs) to define a single declarative template (in YAML). You then parameterize the connection name and deploy 50 small, isolated server pipelines automatically via CI/CD. This prevents one failing database server from crashing the ingestion of the other 49 servers.&lt;/P&gt;</description>
      <pubDate>Wed, 02 Sep 2026 10:01:57 GMT</pubDate>
      <guid>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167272#M12066</guid>
      <dc:creator>Satyasai</dc:creator>
      <dc:date>2026-09-02T10:01:57Z</dc:date>
    </item>
    <item>
      <title>Re: Databricks Data Ingestion</title>
      <link>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167274#M12067</link>
      <description>&lt;P&gt;Just for additional information I hope Netflix is using similar way with metadata as below and created Generic frame work using python to read the metadata and execute the process&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="50%"&gt;Table&lt;/TD&gt;&lt;TD width="50%"&gt;purpose&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Source_system&lt;/TD&gt;&lt;TD&gt;Source registration&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Source_connection&lt;/TD&gt;&lt;TD&gt;Connection details&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Tasble_metadata&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;Table Definitions&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Column_Metadata&lt;/TD&gt;&lt;TD&gt;Column Definitions&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;FILE_FORMAT&lt;/TD&gt;&lt;TD&gt;File configuration&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;PIPELINE&lt;/TD&gt;&lt;TD&gt;Pipeline definitions&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;WORKFLOW&lt;/TD&gt;&lt;TD&gt;Execution order&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Wed, 02 Sep 2026 10:10:12 GMT</pubDate>
      <guid>https://community.databricks.com/t5/get-started-discussions/databricks-data-ingestion/m-p/167274#M12067</guid>
      <dc:creator>Satyasai</dc:creator>
      <dc:date>2026-09-02T10:10:12Z</dc:date>
    </item>
  </channel>
</rss>

