<?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>All Data Engineering posts</title>
    <link>https://community.databricks.com/t5/data-engineering/bd-p/data-engineering</link>
    <description>All Data Engineering posts</description>
    <pubDate>Sun, 15 Nov 2026 18:57:49 GMT</pubDate>
    <dc:creator>data-engineering</dc:creator>
    <dc:date>2026-11-15T18:57:49Z</dc:date>
    <item>
      <title>Databricks Latest Features: Genie Code CLI, App Builder, Agent Memory and DABs Deployment History</title>
      <link>https://community.databricks.com/t5/data-engineering/databricks-latest-features-genie-code-cli-app-builder-agent/m-p/176443#M57145</link>
      <description>&lt;P&gt;Hi everyone,&lt;/P&gt;&lt;P&gt;Databricks has shipped a lot of new features recently. Here’s a quick summary of the most useful ones, grouped by area.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1. DABs Deployment History&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;Databricks Asset Bundles (DABs) now keep a history of every deployment. Each record shows the deployment version, its status, and the resources it manages.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Until now, working out what changed between two bundle deployments meant digging through Git history or comparing configurations by hand. Deployment history shows those changes directly. For example, if you raise a job’s timeout from 60 to 120 seconds and redeploy, the history records exactly that change.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Auditing changes in production environments&lt;/LI&gt;&lt;LI&gt;Troubleshooting when a job starts behaving differently after a deployment&lt;/LI&gt;&lt;LI&gt;Getting better visibility in CI/CD pipelines built on DABs&lt;/LI&gt;&lt;/UL&gt;&lt;HR /&gt;&lt;P&gt;&lt;STRONG&gt;2. Genie Code CLI&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;Genie Code, the Databricks AI coding assistant, now runs from your terminal. It works with your local files and Databricks workflows.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Many developers spend most of their time in a local IDE and terminal. With the CLI, you get AI help without switching to the workspace UI. You can ask it to compare two bundle files, upload files, or help with workflow-related tasks.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Good to know:&lt;/STRONG&gt;&lt;BR /&gt;Model usage from the CLI is billed through &lt;STRONG&gt;Unity Gateway&lt;/STRONG&gt;, so cost tracking and governance stay in one place.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Reviewing changes between bundle configurations&lt;/LI&gt;&lt;LI&gt;Doing routine file and workflow tasks faster&lt;/LI&gt;&lt;LI&gt;Local-first development&lt;/LI&gt;&lt;/UL&gt;&lt;HR /&gt;&lt;P&gt;&lt;STRONG&gt;3. Genie App Builder&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;Describe the app you want in plain language, and Genie App Builder creates a Databricks App. You can then keep refining it through chat.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Building even a simple internal app used to take frontend skills and setup time. Now you can go from an idea to a working prototype in minutes. The original article’s example is a news tracker with sample data that filters six cards by topic, built from a short description.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Governance:&lt;/STRONG&gt;&lt;BR /&gt;Building, sharing and permissions are controlled through &lt;STRONG&gt;App Spaces&lt;/STRONG&gt;, so teams can create apps quickly without losing control over who builds and who can access them.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Quick internal tools and dashboards&lt;/LI&gt;&lt;LI&gt;Prototypes to show business stakeholders&lt;/LI&gt;&lt;LI&gt;Letting analysts and less technical users build simple apps&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;4. Materialized Views and Streaming Tables from Python&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;You can now create standalone materialized views and streaming tables directly from a serverless notebook, using the &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/25059"&gt;@DP&lt;/a&gt;.materialized_view and &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/25059"&gt;@DP&lt;/a&gt;.table decorators.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Previously these objects were usually defined inside a full declarative pipeline. Now, for simpler cases, you can define them right in a notebook in Python, which means less setup and faster development.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Quick incremental aggregations&lt;/LI&gt;&lt;LI&gt;Lightweight streaming ingestion&lt;/LI&gt;&lt;LI&gt;Testing transformation logic before moving it into a full pipeline&lt;/LI&gt;&lt;/UL&gt;&lt;HR /&gt;&lt;P&gt;&lt;STRONG&gt;5. JDBC Connections in Unity Catalog (Generally Available)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;You can save a JDBC driver, endpoint and credentials once as a Unity Catalog connection, then use it by name in any notebook.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Requirements:&lt;/STRONG&gt;&lt;BR /&gt;Serverless compute and DBR 19 or above.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Teams often copy connection strings and credentials across many notebooks, which is a maintenance headache and a security risk. With UC JDBC connections:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Credentials are stored once and governed centrally&lt;/LI&gt;&lt;LI&gt;Access is controlled through Unity Catalog permissions&lt;/LI&gt;&lt;LI&gt;Notebooks stay clean, with no hardcoded connection details&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Reading from external databases such as MySQL, PostgreSQL or SQL Server&lt;/LI&gt;&lt;LI&gt;Sharing approved connections across teams safely&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;6. Audio Transcription in SQL with ai_transcribe (Beta)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;A new AI function that turns audio into timestamped text with speaker labels, called directly from SQL.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Languages:&lt;/STRONG&gt; English and Spanish (currently)&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Audio data used to need separate speech-to-text services and custom pipelines. Now you can transcribe audio with a simple SQL query, then analyze the text with other AI functions such as ai_summarize, ai_classify or ai_analyze_sentiment, all within Databricks.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Call-center analytics (customer sentiment, complaint detection)&lt;/LI&gt;&lt;LI&gt;Meeting and interview transcription&lt;/LI&gt;&lt;LI&gt;Compliance monitoring of recorded calls&lt;/LI&gt;&lt;/UL&gt;&lt;HR /&gt;&lt;P&gt;&lt;STRONG&gt;7. Agent Memory&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What it is:&lt;/STRONG&gt;&lt;BR /&gt;AI agents can now store useful facts and user preferences and use them in later conversations. The memory is stored in &lt;STRONG&gt;Lakebase&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Why it matters:&lt;/STRONG&gt;&lt;BR /&gt;Without memory, every conversation with an agent starts from scratch. With Agent Memory, the agent remembers context. In the original article’s example, a user’s preferred news format is saved and used in a later session, without the earlier conversation being sent again.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Where you’d use it:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Personalized assistants and chatbots&lt;/LI&gt;&lt;LI&gt;Customer support agents that remember past interactions&lt;/LI&gt;&lt;LI&gt;Internal copilots that learn team preferences over time&lt;/LI&gt;&lt;/UL&gt;</description>
      <pubDate>Sun, 15 Nov 2026 14:30:31 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/databricks-latest-features-genie-code-cli-app-builder-agent/m-p/176443#M57145</guid>
      <dc:creator>rajkumar8k</dc:creator>
      <dc:date>2026-11-15T14:30:31Z</dc:date>
    </item>
    <item>
      <title>Re: Issue with CDC ingestion pipeline</title>
      <link>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176442#M57144</link>
      <description>&lt;P&gt;Hi Michael,&lt;/P&gt;&lt;P&gt;I’ve seen this error with Lakeflow Connect database connectors. The s3:/ with nothing after it suggests the pipeline couldn’t work out a storage location for its staging data.&lt;/P&gt;&lt;P&gt;The ingestion gateway first writes the change data to a Unity Catalog volume in the staging catalog and schema you chose during setup. If that catalog or schema has no managed storage location, or the location is set up wrong, the path comes out empty and you get this error.&lt;/P&gt;&lt;P&gt;Things worth checking:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Staging catalog/schema storage:&lt;/STRONG&gt; Make sure the staging catalog (or schema) has a valid managed location backed by an external location, or that your metastore has a root storage location.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Permissions:&lt;/STRONG&gt; The user or service principal running the pipeline needs rights on the external location and storage credential, plus CREATE VOLUME on the staging schema.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Default storage catalogs:&lt;/STRONG&gt; If the staging catalog uses default storage, try a catalog with your own S3 managed location instead.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Event log:&lt;/STRONG&gt; Look at the gateway pipeline’s event log for a more detailed error than the main pipeline shows.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;If you point the gateway at a staging catalog/schema with a proper S3 managed location and run it again, it should get past this step.&lt;/P&gt;&lt;P&gt;Hope this helps!&lt;/P&gt;</description>
      <pubDate>Sun, 15 Nov 2026 14:14:19 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176442#M57144</guid>
      <dc:creator>rajkumar8k</dc:creator>
      <dc:date>2026-11-15T14:14:19Z</dc:date>
    </item>
    <item>
      <title>Re: How do you test data quality in a Delta Lake pipeline?</title>
      <link>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176441#M57143</link>
      <description>&lt;P&gt;In my experience a combination works best:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;DLT / Lakeflow expectations&lt;/STRONG&gt; check data quality while the pipeline runs. Use warn, drop or fail depending on how serious the issue is, and send bad records to a quarantine table instead of losing them.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;PySpark unit tests&lt;/STRONG&gt; (pytest) check your transformation logic in CI before you deploy.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;For your specific points:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Schema changes:&lt;/STRONG&gt; Use Auto Loader with schema evolution and the rescued data column, so unexpected fields get flagged instead of breaking the pipeline.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Duplicates:&lt;/STRONG&gt; Deduplicate on business keys and use MERGE so reruns don’t create duplicates.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Nulls:&lt;/STRONG&gt; Use expectations on key columns.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Incremental validation:&lt;/STRONG&gt; Check row counts, data freshness and expectation metrics for each batch, using the pipeline event log.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Source vs target:&lt;/STRONG&gt; Add a reconciliation step that compares row counts and key totals after each load.&lt;/LI&gt;&lt;/UL&gt;</description>
      <pubDate>Sun, 15 Nov 2026 14:10:05 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176441#M57143</guid>
      <dc:creator>rajkumar8k</dc:creator>
      <dc:date>2026-11-15T14:10:05Z</dc:date>
    </item>
    <item>
      <title>Re: Missing spark structured streaming metadata blobs?</title>
      <link>https://community.databricks.com/t5/data-engineering/missing-spark-structured-streaming-metadata-blobs/m-p/176426#M57142</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/3844"&gt;@DB1To3&lt;/a&gt;&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks for accepting the answer. On the docs you asked for: the Structured Streaming checkpoints page says "Each query must have a different checkpoint location. Multiple queries should never share the same location", and the two error messages are in the Databricks error reference (search for CONCURRENT_QUERY and CONCURRENT_STREAM_LOG_UPDATE). I have not seen a page that explains how they are detected, so your test is a good idea: start the same availableNow query twice, on two compute resources, with the same checkpoint, and you should see one of the two errors. On your runs/submit question: the API reference says that runs submitted with that endpoint "are not saved as a job", so a job's "maximum concurrent runs" setting cannot protect them. The endpoint has an optional idempotency_token, and the same page says "Databricks guarantees that exactly one run is launched with that idempotency token". If your scheduler builds the token from the schedule slot (for example the query name plus the planned start time), a retry or a double submit for the same slot cannot start a second run. It does not stop the next slot from starting while the previous run is still going, so for that the checkpoint errors remain your guard, or you can use jobs/create plus jobs/run-now, which the same page suggests.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Docs: &lt;A href="https://docs.databricks.com/api/workspace/jobs/submit" target="_blank"&gt;https://docs.databricks.com/api/workspace/jobs/submit&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sun, 15 Nov 2026 04:34:37 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/missing-spark-structured-streaming-metadata-blobs/m-p/176426#M57142</guid>
      <dc:creator>Yougasundar</dc:creator>
      <dc:date>2026-11-15T04:34:37Z</dc:date>
    </item>
    <item>
      <title>Re: Pushing a notebook with outputs to Github</title>
      <link>https://community.databricks.com/t5/data-engineering/pushing-a-notebook-with-outputs-to-github/m-p/176425#M57141</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/271773"&gt;@2nonto&lt;/a&gt;,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;That message comes from the step that creates the .databricks/commit_outputs file, which controls whether the outputs of .ipynb notebooks are committed. Please check these points in order. 1) Committing outputs is off by default. A workspace admin must open Settings &amp;gt; Workspace admin &amp;gt; Development and, in the Repos section, set "Allow repos to export IPYNB output" to "Allow: IPYNB outputs can be toggled on". 2) The notebook must be in IPYNB format and inside a Git folder, because only IPYNB notebooks can carry outputs. You can convert it with File &amp;gt; Notebook format &amp;gt; Jupyter (.ipynb). 3) Then create the file again from the Git dialog with "Create commit_outputs config file", or with File &amp;gt; Commit notebook outputs &amp;gt; Include Outputs. 4) The file is created inside your Git folder, so also check that you can edit that folder. If it still fails after these checks, please share the full error text and tell us if the admin setting is on.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Docs: &lt;A href="https://docs.databricks.com/aws/en/notebooks/notebook-format" target="_blank"&gt;https://docs.databricks.com/aws/en/notebooks/notebook-format&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sun, 15 Nov 2026 04:25:47 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/pushing-a-notebook-with-outputs-to-github/m-p/176425#M57141</guid>
      <dc:creator>Yougasundar</dc:creator>
      <dc:date>2026-11-15T04:25:47Z</dc:date>
    </item>
    <item>
      <title>Re: Is Databricks Losing Its Charm in the Age of AI?</title>
      <link>https://community.databricks.com/t5/data-engineering/is-databricks-losing-its-charm-in-the-age-of-ai/m-p/176417#M57140</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/121531"&gt;@thekushalvishwa&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;AI can write the pipeline in few seconds. It might not explain the DBU bill to finance. A timely post, and one I suspect many of us relate to.&lt;/P&gt;&lt;P&gt;My take is that AI has made writing the code cheap, so our value has moved to the parts it can’t see. Databricks Assistant can write a decent MERGE, but it doesn’t know your table is skewed on one customer key, that Auto Loader is picking up late-arriving files, or that the job has to fit a monthly DBU budget. Choosing between liquid clustering and partitioning, reading a query plan to see why AQE didn’t fix a bad join, deciding whether Photon is worth the cost for a given workload, setting up UC permissions and lineage properly, these are judgment calls that depend on context the AI doesn’t have.&lt;/P&gt;&lt;P&gt;On clients arriving with AI-generated solutions and timelines, I treat it as a starting point and ask what the AI didn’t. What happens at 10x volume? What does this cost per run according to the system tables? How do we reprocess when the logic changes? Who owns it when the Workflow fails at 2am? The estimate usually changes once those are on the table.&lt;/P&gt;&lt;P&gt;There’s also a point we don’t talk about enough. AI is a service, and services go down. If a region outage or a data centre incident takes the assistant offline in the middle of a production issue, the pipeline still has to be fixed, and the person who fixes it is the one who understands Spark, Delta Lake and the data flow without help. We tend to recognise the value of something only when it’s unavailable, and I think that applies to engineers as much as to the tools.&lt;/P&gt;&lt;P&gt;As for how I’m approaching it in practice:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Design first, AI second.&lt;/STRONG&gt; I sketch the architecture and data flow myself (medallion layers, clustering strategy, incremental vs full load) and then use AI to speed up the build, not to decide the design.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Review AI output like a junior’s pull request.&lt;/STRONG&gt; I check the query plan, the shuffle and file sizes, and the cost before anything reaches production.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Keep one manual habit.&lt;/STRONG&gt; Every so often I debug a failed job or tune a slow query without the assistant, so the skill stays sharp.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Spend the saved time upstream.&lt;/STRONG&gt; The hours AI gives back go into data quality expectations, governance in UC and talking to the business about what they need.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Keen to hear other views. Until then, I’ll be here explaining the DBU bill.&lt;/P&gt;</description>
      <pubDate>Sat, 14 Nov 2026 22:26:15 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/is-databricks-losing-its-charm-in-the-age-of-ai/m-p/176417#M57140</guid>
      <dc:creator>data_pulse</dc:creator>
      <dc:date>2026-11-14T22:26:15Z</dc:date>
    </item>
    <item>
      <title>Is Databricks Losing Its Charm in the Age of AI?</title>
      <link>https://community.databricks.com/t5/data-engineering/is-databricks-losing-its-charm-in-the-age-of-ai/m-p/176416#M57139</link>
      <description>&lt;P&gt;&lt;SPAN&gt;I've been working with Databricks for nearly eight years, and lately I've been reflecting on how our role as data engineers is evolving.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;One thing I've noticed is that development is increasingly becoming about prompting AI, troubleshooting issues, fixing bugs, and making workflow adjustments rather than actually engineering solutions from the ground up.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Don't get me wrong, AI is a powerful tool, and there's no point in resisting it. But I sometimes feel that by becoming too dependent on AI, we're gradually losing some of our core engineering capabilities and, more importantly, our ability to challenge things independently.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Another concern is that clients are becoming increasingly familiar with AI-generated solutions. They come to us with suggested implementations, estimated development timelines, and even proposed approaches to fixing technical issues. Sometimes, they already have an idea of how long something should take because AI has given them an answer.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;So, the real question is: &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN&gt;How do we differentiate ourselves as experienced data engineers in this new AI-driven environment?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;How do we move beyond simply executing AI-generated suggestions and demonstrate that we understand the underlying architecture, data flows, performance implications, scalability, cost optimisation, security, and long-term maintainability better than a generic AI-generated solution?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Ultimately, I believe our value shouldn't be measured by how quickly we can prompt AI or fix a bug. It should be measured by our ability to question assumptions, identify problems that aren't immediately obvious, make sound engineering decisions, and deliver solutions that are technically superior to what a client might initially propose.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I'd be interested in hearing how other experienced data engineers and architects are approaching this shift.&lt;BR /&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/121531"&gt;@thekushalvishwa&lt;/a&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;#Spar&lt;/SPAN&gt;&lt;SPAN&gt;#Delta Lake#&lt;/SPAN&gt;&lt;SPAN&gt;Workflows&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 14 Nov 2026 20:46:34 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/is-databricks-losing-its-charm-in-the-age-of-ai/m-p/176416#M57139</guid>
      <dc:creator>thekushalvishwa</dc:creator>
      <dc:date>2026-11-14T20:46:34Z</dc:date>
    </item>
    <item>
      <title>Pushing a notebook with outputs to Github</title>
      <link>https://community.databricks.com/t5/data-engineering/pushing-a-notebook-with-outputs-to-github/m-p/176387#M57138</link>
      <description>&lt;P&gt;I am experiencing an error when trying to commit output and Databricks notebook to GitHub. The error message states, "Error creating or updating commit outputs config file."&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-11-11 214121.png" style="width: 510px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/33340i6FAA7E98E8A5BA93/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-11-11 214121.png" alt="Screenshot 2026-11-11 214121.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Could you please assist me in resolving this issue?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 14 Nov 2026 07:57:02 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/pushing-a-notebook-with-outputs-to-github/m-p/176387#M57138</guid>
      <dc:creator>2nonto</dc:creator>
      <dc:date>2026-11-14T07:57:02Z</dc:date>
    </item>
    <item>
      <title>Re: How do you test data quality in a Delta Lake pipeline?</title>
      <link>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176383#M57137</link>
      <description>&lt;P&gt;&lt;SPAN&gt;The right pattern is to treat validation as &lt;STRONG&gt;multi layered&lt;/STRONG&gt; instead of a single gate. You can start with handling &lt;STRONG&gt;schema changes&lt;/STRONG&gt; and &lt;STRONG&gt;schema evolution&lt;/STRONG&gt; at ingestion. You can configure Auto Loader with a dedicated schema at the ingestion point to prevent type mismatch challenges. It can route un parsable data to a rescued data columncan fail the stream when a new column appears so you can evolve the schema consciously. On the Delta table, enabling schema merging allows new columns to be added automatically without a table rewrite. For changes like column renames, drops and type widening, enabling column mapping and type widening on the table lets those updates go through without triggering full rewrites.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Handling duplicate records and null or missing values requires separating storage level guarantees from transformation logic. You can handle deduplication in the transformation logic - by using a merge operation with a key predicate to upsert on a last write win basis or by applying a row number window function partitioned by the key and ordered by timestamp to retain the latest record prior to writing. You can pair the deduplication step with a pipeline expectation - such as asserting that an order ID is not null under a unique keys rule to track violations in the event log while routing dropped duplicates to a quarantine table for replay. For &lt;STRONG&gt;null&lt;/STRONG&gt; and &lt;STRONG&gt;missing&lt;/STRONG&gt; values, You can enforce rules across two distinct layers using not null and check constraints. Inside the pipeline, expectations with explicit failure policies give granular control - use an expect or drop policy to discard malformed rows like missing values while still logging the violation count or an expect or fail policy for critical fields that must stop execution immediately. Use the warn policy strictly for metrics where you actively check the trend and otherwise default to dropping bad records into a quarantine table so nothing is lost.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For &lt;STRONG&gt;incremental&lt;/STRONG&gt; data validation and &lt;STRONG&gt;cross-table&lt;/STRONG&gt; consistency, your can shift toward observability and reconciliation. Enabling &lt;STRONG&gt;Change Data Feed&lt;/STRONG&gt; in the table properties of upstream Delta tables allows downstream pipelines to read a queryable change log of inserts, updates, and deletes instead of re scanning the entire table on every run. You can then validate each batch by asserting &lt;STRONG&gt;expectations&lt;/STRONG&gt; directly against the &lt;STRONG&gt;incoming change feed -&amp;nbsp;&lt;/STRONG&gt;checking for non-null keys, valid date ranges and expected event types before you merge records into the target. In streaming workloads - Auto Loader checkpoints combined with the rescued data column provide per micro batch visibility into rejected records and tracking expectation pass rates over time in the pipeline event log helps you catch data drift early. To isolate silent &lt;STRONG&gt;drift&lt;/STRONG&gt; between &lt;STRONG&gt;source&lt;/STRONG&gt; and &lt;STRONG&gt;target&lt;/STRONG&gt; tables after each pipeline update, you can run an &lt;STRONG&gt;reconciliation&lt;/STRONG&gt; step that compares row counts, sum or count aggregations on key numeric columns or a 64 bit hash across key columns on both sides and it executes faster than a row by row comparison. For upsert cases using merge operations, leveraging a when not matched by source clause with a conditional predicate lets detect and handle target side records that no longer exist in the source without a full rewrite. Embedding these reconciliation checks as downstream SQL assertion job tasks ensures the workflow fails automatically if counts diverge beyond defined tolerance while preserving rejected rows for investigation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can use&amp;nbsp;&lt;STRONG&gt;PySpark tests&lt;/STRONG&gt;, &lt;STRONG&gt;pipeline expectations&lt;/STRONG&gt;&amp;nbsp;and &lt;STRONG&gt;table constraints&lt;/STRONG&gt; as a combination in real world projects because each mechanism protects a different moment in the lifecycle. &lt;STRONG&gt;Expectations&lt;/STRONG&gt; within Lakeflow Declarative Pipelines handle inline, row level validation during processing using warn, drop, and fail policies while centralizing quality metrics in the event log. Delta not null and check constraints serve as the backstop at write time, preventing corrupt data from landing in the table even if the primary pipeline is bypassed by manual inserts or external jobs. PySpark assertion jobs cover post write validation and continuous integration testing - verifying that filtering for null IDs returns zero rows, comparing dataframe column sets for schema drift and running count assertions that fail the job on error. Every dataset capable of receiving bad data should define at least one expectation and you should deliberately choose between warn, drop and fail policies for each individual constraint.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 14 Nov 2026 07:22:08 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176383#M57137</guid>
      <dc:creator>balajij8</dc:creator>
      <dc:date>2026-11-14T07:22:08Z</dc:date>
    </item>
    <item>
      <title>Re: SparkSession.getActiveSession() is Suddenly Broken in Python Multi-threading</title>
      <link>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176377#M57136</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/34815"&gt;@Louis_Frolio&lt;/a&gt;&amp;nbsp;I submitted a ticket to support. Apparently without a paid support contract they won't address the issue even though it appears to be a sudden breaking changing in platform behavior vs user error.&lt;/P&gt;</description>
      <pubDate>Sat, 14 Nov 2026 02:31:38 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176377#M57136</guid>
      <dc:creator>ifishbein</dc:creator>
      <dc:date>2026-11-14T02:31:38Z</dc:date>
    </item>
    <item>
      <title>Re: Lakebase Data API</title>
      <link>https://community.databricks.com/t5/data-engineering/lakebase-data-api/m-p/176376#M57135</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/271176"&gt;@Jack17&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;One small addition to the service principal advice above, because it makes testing a lot easier. Since 12 November, OAuth on-behalf-of for service principals is generally available, so you can test the Data API locally as the same service principal your job will run as, without creating an OAuth secret for it:&lt;/P&gt;&lt;PRE&gt;databricks auth login --host https://your-workspace-url
# in the browser, pick the service principal from the dropdown and authorize
databricks auth token --host https://your-workspace-url&lt;/PRE&gt;&lt;P&gt;You need the Service Principal Manager role on that service principal (you get it automatically if you created it). Use the token as the Bearer token for your test POSTs. If the inserts work locally with it, you know the Postgres role and grants for the service principal are right before you schedule anything, and the scheduled job then runs as that same service principal.&lt;/P&gt;&lt;P&gt;Cheers,&lt;BR /&gt;Suranga&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 21:33:24 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/lakebase-data-api/m-p/176376#M57135</guid>
      <dc:creator>suranga</dc:creator>
      <dc:date>2026-11-13T21:33:24Z</dc:date>
    </item>
    <item>
      <title>Re: How do you test data quality in a Delta Lake pipeline?</title>
      <link>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176375#M57134</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/271122"&gt;@AlexMorgan&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;Mateus covered the checks really well, so I'll just add how I'd answer the PySpark tests vs expectations part, because the two do different jobs:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Tests check your code.&lt;/STRONG&gt; Unit-test the transformation logic in CI on small, hand-made DataFrames. pyspark.testing has assertDataFrameEqual and assertSchemaEqual, so a test is just "this input should give this output", including the awkward rows: nulls, duplicates, late updates.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Expectations check your data.&lt;/STRONG&gt; They run on every batch inside the pipeline, so they catch what tests never will, like a source that suddenly starts sending nulls or duplicates.&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;CONSTRAINT valid_id EXPECT (id IS NOT NULL) ON VIOLATION DROP ROW&lt;/PRE&gt;&lt;P&gt;In Python it's &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/25059"&gt;@DP&lt;/a&gt;.expect_or_drop or &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/25059"&gt;@DP&lt;/a&gt;.expect_or_fail. My rule of thumb: warn on soft rules, drop or quarantine on row-level problems, and fail when it means the whole batch is wrong.&lt;/P&gt;&lt;P&gt;For schema changes, if you ingest files with Auto Loader, cloudFiles.schemaEvolutionMode decides what happens. addNewColumns (the default) stops the stream so it can restart with the new columns, rescue keeps the schema and puts anything unexpected in _rescued_data, and failOnNewColumns simply fails. An expectation that _rescued_data is null is a cheap way to catch type drift early.&lt;/P&gt;&lt;P&gt;One newer option worth a look: Genie ZeroOps went into Beta on 12 November. It monitors jobs, pipelines and tables in the background, flags failures and data quality issues, and proposes a fix. It's only just out, so I'd treat it as a complement to the checks above rather than a replacement.&lt;/P&gt;&lt;P&gt;Cheers,&lt;BR /&gt;Suranga&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 21:32:15 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-do-you-test-data-quality-in-a-delta-lake-pipeline/m-p/176375#M57134</guid>
      <dc:creator>suranga</dc:creator>
      <dc:date>2026-11-13T21:32:15Z</dc:date>
    </item>
    <item>
      <title>Re: Issue with CDC ingestion pipeline</title>
      <link>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176369#M57133</link>
      <description>&lt;P&gt;Hi &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/271661"&gt;@MichaelAnckaert&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;The interesting part is the path in the error: s3:/ with nothing after it. That isn't coming from MySQL. It looks like the pipeline tried to resolve a storage location in Unity Catalog and got back an empty S3 path, and since the destination tables were already created by then, my first suspect is the staging location the connector writes to.&lt;/P&gt;&lt;P&gt;Three things I'd check:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1. Where the staging catalog and schema actually store data.&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;DESCRIBE CATALOG EXTENDED &amp;lt;staging_catalog&amp;gt;;
DESCRIBE SCHEMA EXTENDED &amp;lt;staging_catalog&amp;gt;.&amp;lt;staging_schema&amp;gt;;&lt;/PRE&gt;&lt;P&gt;Look at the storage root or location in the output. If neither the catalog nor the schema has one, and the metastore has no root storage either, there's nowhere for the staging volume to live.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;2. Default storage.&lt;/STRONG&gt; If the staging catalog was created on default storage (the option you get in a serverless workspace), the docs say it can only be accessed from serverless compute. The MySQL ingestion gateway runs on classic job compute, so it can't write there. Pointing staging at a catalog or schema with a managed location on your own S3 bucket (through an external location) gets around that.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;3. Privileges on the staging schema.&lt;/STRONG&gt; You need USE SCHEMA, CREATE TABLE and CREATE VOLUME there, and the troubleshooting page also notes that the staging catalog can't be a foreign catalog.&lt;/P&gt;&lt;P&gt;If you'd rather stay fully serverless, the newer integrated CDC pipeline for MySQL can run on serverless compute, as long as serverless can reach your MySQL instance over the network.&lt;/P&gt;&lt;P&gt;If none of that matches, the pipeline's event log should have the full error with a stack trace. Post it here and I'm happy to take another look.&lt;/P&gt;&lt;P&gt;Cheers,&lt;BR /&gt;Suranga&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 21:13:21 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176369#M57133</guid>
      <dc:creator>suranga</dc:creator>
      <dc:date>2026-11-13T21:13:21Z</dc:date>
    </item>
    <item>
      <title>Re: SparkSession.getActiveSession() is Suddenly Broken in Python Multi-threading</title>
      <link>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176368#M57132</link>
      <description>&lt;P&gt;Thanks Louis! I'll reach out to support to see if they can pinpoint a more specific root cause for this becoming a problem yesterday and will refactor our codebase.&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 19:39:26 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176368#M57132</guid>
      <dc:creator>ifishbein</dc:creator>
      <dc:date>2026-11-13T19:39:26Z</dc:date>
    </item>
    <item>
      <title>Re: Lakebase Data API</title>
      <link>https://community.databricks.com/t5/data-engineering/lakebase-data-api/m-p/176367#M57131</link>
      <description>&lt;P&gt;Hello Jack17, I took a look at both internal and external documentation and here is what I found.&lt;/P&gt;
&lt;P&gt;Divya_Pathak's flow (pull with &lt;CODE&gt;requests&lt;/CODE&gt;, flatten, write to Lakebase, schedule it as a job) is the right skeleton, and DoTA's cautions are the ones that bite: the OAuth token expires after an hour, there's no documented payload or rate limit on Data API POSTs, and a service principal is the identity to run under. One question decides the rest of the design, and the post doesn't say: where will the code that pulls from the external API run?&lt;/P&gt;
&lt;P&gt;If it runs outside Databricks (a small service, a serverless function, or the source system pushing to you), the Data API fits. It's PostgREST-compatible, so POST a JSON array to &lt;CODE&gt;/public/&amp;lt;table&amp;gt;&lt;/CODE&gt; and you get one row per element in a single request. Add the header &lt;CODE&gt;Prefer: resolution=merge-duplicates&lt;/CODE&gt; (optionally with &lt;CODE&gt;on_conflict=&amp;lt;key_column&amp;gt;&lt;/CODE&gt;) and re-pulling overlapping data becomes insert-or-update instead of a duplicate-key error. The API URL is on the API tab in the Lakebase App; the token comes from the OAuth flow on the authentication page, not from that tab. Setup gotchas from the docs: it needs an Autoscaling project; don't use the project owner identity, because &lt;CODE&gt;authenticator&lt;/CODE&gt; can't assume it; create the role with &lt;CODE&gt;SELECT databricks_create_role(...)&lt;/CODE&gt; in the SQL editor rather than the Roles &amp;amp; Databases UI, or &lt;CODE&gt;GRANT "&amp;lt;identity&amp;gt;" TO authenticator&lt;/CODE&gt; fails with SQLSTATE 42501; and click Refresh schema cache after you create or alter the table.&lt;/P&gt;
&lt;P&gt;If it runs as a Databricks notebook or job, skip the HTTP hop and use a Postgres driver. Mint the same token with the SDK, connect with &lt;CODE&gt;psycopg&lt;/CODE&gt; over SSL, and use &lt;CODE&gt;executemany&lt;/CODE&gt; or &lt;CODE&gt;COPY&lt;/CODE&gt;. If the JSON is nested, store the raw payload in a &lt;CODE&gt;jsonb&lt;/CODE&gt; column and flatten it with SQL later:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;import psycopg, requests
from databricks.sdk import WorkspaceClient
from psycopg.types.json import Jsonb

records = requests.get("https://api.example.com/items", timeout=60).json()
cred = WorkspaceClient().postgres.generate_database_credential(
    endpoint="projects/&amp;lt;project&amp;gt;/branches/&amp;lt;branch&amp;gt;/endpoints/&amp;lt;endpoint&amp;gt;")

with psycopg.connect(host="&amp;lt;host&amp;gt;", dbname="databricks_postgres",
                     user="&amp;lt;identity&amp;gt;", password=cred.token, sslmode="require") as conn:
    conn.cursor().executemany(
        """INSERT INTO public.api_data (id, payload) VALUES (%s, %s)
           ON CONFLICT (id) DO UPDATE SET payload = EXCLUDED.payload""",
        [(r["id"], Jsonb(r)) for r in records])
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Generate a fresh credential each time you open a connection, keep the service principal secret in a Databricks secret scope, and give that principal INSERT on the target table.&lt;/P&gt;
&lt;P&gt;If the JSON also belongs in the lakehouse, there's a third route: write it to a Delta table first, then create a synced table from Unity Catalog into your Lakebase project. The Postgres copy is read-only, which is fine if the app only reads it, and you keep the Delta history.&lt;/P&gt;
&lt;P&gt;Short version: Data API when the writer lives outside Databricks, a Postgres driver when it lives inside, synced tables when the data needs to exist in both places anyway.&lt;/P&gt;
&lt;P&gt;References:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Lakebase Data API: &lt;A href="https://docs.databricks.com/aws/en/oltp/projects/data-api" target="_blank"&gt;https://docs.databricks.com/aws/en/oltp/projects/data-api&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Lakebase authentication and token rotation: &lt;A href="https://docs.databricks.com/aws/en/oltp/projects/authentication" target="_blank"&gt;https://docs.databricks.com/aws/en/oltp/projects/authentication&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Connect an external app with the SDK (service principal plus psycopg): &lt;A href="https://docs.databricks.com/aws/en/oltp/projects/external-apps-connect" target="_blank"&gt;https://docs.databricks.com/aws/en/oltp/projects/external-apps-connect&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Synced tables for Autoscaling projects: &lt;A href="https://docs.databricks.com/aws/en/oltp/projects/sync-tables" target="_blank"&gt;https://docs.databricks.com/aws/en/oltp/projects/sync-tables&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;PostgREST API reference (bulk insert, upsert, Prefer headers): &lt;A href="https://postgrest.org/en/stable/references/api.html" target="_blank"&gt;https://postgrest.org/en/stable/references/api.html&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Regards,&lt;BR /&gt;Louis.&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 19:16:29 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/lakebase-data-api/m-p/176367#M57131</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2026-11-13T19:16:29Z</dc:date>
    </item>
    <item>
      <title>Re: SparkSession.getActiveSession() is Suddenly Broken in Python Multi-threading</title>
      <link>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176365#M57130</link>
      <description>&lt;P&gt;Hello &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/271668"&gt;@ifishbein&lt;/a&gt;, I dug in and here is what I found.&lt;/P&gt;
&lt;P&gt;The serverless behavior is explainable, and your workaround is the right one. Serverless runs on Spark Connect, and in the Spark Connect flavor of PySpark &lt;CODE&gt;SparkSession.getActiveSession()&lt;/CODE&gt; is backed by a plain Python &lt;CODE&gt;threading.local()&lt;/CODE&gt;. That slot gets filled in the thread that created the session (your notebook's main thread) and nowhere else. A &lt;CODE&gt;ThreadPoolExecutor&lt;/CODE&gt; worker starts with an empty slot, so &lt;CODE&gt;getActiveSession()&lt;/CODE&gt; returns &lt;CODE&gt;None&lt;/CODE&gt; and the first &lt;CODE&gt;.read&lt;/CODE&gt; on it fails with the exact &lt;CODE&gt;'NoneType' object has no attribute 'read'&lt;/CODE&gt; you're seeing. &lt;CODE&gt;SparkSession.builder.getOrCreate()&lt;/CODE&gt; checks the thread-local first and then falls back to the process-wide default session (your notebook's &lt;CODE&gt;spark&lt;/CODE&gt;), which is why swapping the call fixed it. Classic compute reaches the session by a different route, which likely explains the different symptom there.&lt;/P&gt;
&lt;P&gt;What I can't explain is why it worked before roughly 3PM EST on 11/12. I don't know what changed in the serverless environment that day and I'd rather not guess. Please open a support ticket with a few failing run IDs and timestamps for both the classic and serverless jobs; the classic failures clearing on their own around 6PM is a useful data point for them. Also check the history on status.databricks.com for your region that afternoon.&lt;/P&gt;
&lt;P&gt;On the code side, I'd steer away from &lt;CODE&gt;getActiveSession()&lt;/CODE&gt; inside worker threads entirely, on either compute type. The most portable fix is to pass the session in from the main thread:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;from concurrent.futures import ThreadPoolExecutor

def test(foo, spark):
    print(spark)
    # spark.read.... goes here

with ThreadPoolExecutor(max_workers=4) as executor:
    futures = {executor.submit(test, foo, spark): foo for foo in ["A", "B", "C", "D"]}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;One &lt;CODE&gt;SparkSession&lt;/CODE&gt; is safe to share across driver-side threads like this. If you'd rather look the session up inside the thread, &lt;CODE&gt;SparkSession.active()&lt;/CODE&gt; (PySpark 3.5 and later) returns the active session if there is one and otherwise the default, which is the fallback you actually want. &lt;CODE&gt;getOrCreate()&lt;/CODE&gt; does the same thing in practice.&lt;/P&gt;
&lt;P&gt;One caution if you go looking at &lt;CODE&gt;pyspark.InheritableThread&lt;/CODE&gt; or &lt;CODE&gt;inheritable_thread_target&lt;/CODE&gt; as a fix. They were built for pinned thread mode on classic compute, where each Python thread gets its own JVM thread and Spark local properties don't carry over. On Spark Connect they require you to pass the session explicitly, and they propagate the client's thread-locals such as tags, not the active session, so &lt;CODE&gt;getActiveSession()&lt;/CODE&gt; in the child thread still comes back &lt;CODE&gt;None&lt;/CODE&gt;. Pass &lt;CODE&gt;spark&lt;/CODE&gt; in instead.&lt;/P&gt;
&lt;P&gt;Takeaway: treat the session as something you hand to a thread, not something a thread goes looking for. That works the same on classic and serverless and survives whatever happened on Wednesday.&lt;/P&gt;
&lt;P&gt;References:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;getActiveSession()&lt;/CODE&gt;: &lt;A href="https://docs.databricks.com/aws/en/pyspark/reference/classes/sparksession/getActiveSession" target="_blank"&gt;https://docs.databricks.com/aws/en/pyspark/reference/classes/sparksession/getActiveSession&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;SparkSession.active()&lt;/CODE&gt;: &lt;A href="https://docs.databricks.com/aws/en/pyspark/reference/classes/sparksession/active" target="_blank"&gt;https://docs.databricks.com/aws/en/pyspark/reference/classes/sparksession/active&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Spark Connect session source (see &lt;CODE&gt;_active_session&lt;/CODE&gt; and &lt;CODE&gt;getActiveSession&lt;/CODE&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt; &lt;A href="https://github.com/apache/spark/blob/master/python/pyspark/sql/connect/session.py" target="_blank"&gt;https://github.com/apache/spark/blob/master/python/pyspark/sql/connect/session.py&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;pyspark.InheritableThread&lt;/CODE&gt;: &lt;A href="https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.InheritableThread.html" target="_blank"&gt;https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.InheritableThread.html&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;pyspark.inheritable_thread_target&lt;/CODE&gt;: &lt;A href="https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.inheritable_thread_target.html" target="_blank"&gt;https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.inheritable_thread_target.html&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Databricks Connect behavior in notebooks and jobs: &lt;A href="https://docs.databricks.com/aws/en/dev-tools/databricks-connect/notebooks" target="_blank"&gt;https://docs.databricks.com/aws/en/dev-tools/databricks-connect/notebooks&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Platform status: &lt;A href="https://status.databricks.com" target="_blank"&gt;https://status.databricks.com&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Regards,&lt;BR /&gt;Louis&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 18:54:12 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176365#M57130</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2026-11-13T18:54:12Z</dc:date>
    </item>
    <item>
      <title>Re: How to Connect Databricks to Snowflake &amp; Query Live Data?</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-connect-databricks-to-snowflake-amp-query-live-data/m-p/176363#M57129</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/5425"&gt;@raj&lt;/a&gt;&amp;nbsp;, if you are happy with the answer and it addresses your issue please mark "Accept as Solution" so that others can have confidence in the response. Cheers, Lou.&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 17:54:49 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-connect-databricks-to-snowflake-amp-query-live-data/m-p/176363#M57129</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2026-11-13T17:54:49Z</dc:date>
    </item>
    <item>
      <title>Re: Serverless declarative pipeline ingestion from ADLS is running x4 SLOWER randomly</title>
      <link>https://community.databricks.com/t5/data-engineering/serverless-declarative-pipeline-ingestion-from-adls-is-running/m-p/176361#M57128</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/22314"&gt;@saurabh18cs&lt;/a&gt;&amp;nbsp;, That is classic compute. Serverless does not allow the configuration of max workers.&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 17:53:04 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/serverless-declarative-pipeline-ingestion-from-adls-is-running/m-p/176361#M57128</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2026-11-13T17:53:04Z</dc:date>
    </item>
    <item>
      <title>SparkSession.getActiveSession() is Suddenly Broken in Python Multi-threading</title>
      <link>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176357#M57127</link>
      <description>&lt;P&gt;Hello everyone,&lt;/P&gt;&lt;P&gt;Around 3PM EST yesterday (2026-11-12), dozens of Lakeflow jobs started failing on both classic and serverless compute with distinct symptoms&lt;/P&gt;&lt;P&gt;1. On classic compute (DBR 15.4), reading a file from S3 would result in a PATH NOT FOUND error&lt;/P&gt;&lt;P&gt;2. On serverless compute (v2 and v5), reading a file from S3 would result in a "'NoneType' has not attribute 'read'" error indicating the SparkSession object was None/null&lt;/P&gt;&lt;P&gt;The issue appears to be resolved on classic compute as of 6PM EST 2026-11-12. The issue is ongoing on serverless compute. This is the simplest bit of code that demonstrates the issue.&lt;/P&gt;&lt;LI-CODE lang="python"&gt;from concurrent.futures import ThreadPoolExecutor
from pyspark.sql import SparkSession

def test(foo):
    print(SparkSession.getActiveSession())

with ThreadPoolExecutor(max_workers=4) as executor:
    future_to_batch = {
        executor.submit(test, foo): foo for foo in [“A”, “B”, “C”, “D”]
    }&lt;/LI-CODE&gt;&lt;P&gt;Instead of a SparkSession object appearing in cell output, we see "None". Replacing SparkSession.getActiveSession() with SparkSession.builder.getOrCreate() alleviates the problem.&lt;/P&gt;&lt;P&gt;Is anyone else seeing this?&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 15:45:09 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/sparksession-getactivesession-is-suddenly-broken-in-python-multi/m-p/176357#M57127</guid>
      <dc:creator>ifishbein</dc:creator>
      <dc:date>2026-11-13T15:45:09Z</dc:date>
    </item>
    <item>
      <title>Issue with CDC ingestion pipeline</title>
      <link>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176354#M57126</link>
      <description>&lt;P&gt;Hello everyone&lt;/P&gt;&lt;P&gt;I'm trying to setup an ingestion pipeline from a mysql server and keep running into an issue.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The setup was validated and the pipeline created. When I run the pipeline the destination tables are created in the schema, but then the following error is displayed:&lt;/P&gt;&lt;P&gt;Error class: INVALID_PARAMETER_VALUE&lt;BR /&gt;Message: Input URI is not a valid UC Path: s3:/&lt;/P&gt;&lt;P&gt;The pipeline stops after this without further information.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I would appreciate some information or pointers on how I can resolve this issue.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 13 Nov 2026 15:18:05 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/issue-with-cdc-ingestion-pipeline/m-p/176354#M57126</guid>
      <dc:creator>MichaelAnckaert</dc:creator>
      <dc:date>2026-11-13T15:18:05Z</dc:date>
    </item>
  </channel>
</rss>

