Data teams don’t operate in isolation. The marketing analytics team needs the customer 360 table from the data engineering group. The external consulting firm needs read access to aggregated metrics. The ML team in a different workspace needs the feature store tables.
The traditional answer is data copies. Export to S3, share credentials, hope the consumer picks up the right version. Or worse, set up a dedicated ETL pipeline just to move data from one workspace to another. Every copy is a liability: stale data, duplicated storage costs, credentials sprawling across systems.
Delta Sharing takes a different approach. The provider publishes a share. The consumer reads from it. No data moves. No credentials are exchanged for the underlying storage. The provider controls what’s shared at the table level, and Unity Catalog enforces it.
This works across Databricks workspaces, and it works outside Databricks entirely. The Delta Sharing protocol is open – any client that speaks it can consume shared tables. That includes pandas, Apache Spark OSS, and PowerBI.
How Delta Sharing Works #
flowchart TB
subgraph Provider["Provider Workspace"]
UC["Unity Catalog"]
T1["gold.customer_360"]
T2["gold.revenue_metrics"]
SH["Share: analytics_share"]
UC --> T1
UC --> T2
T1 --> SH
T2 --> SH
end
subgraph DBX["Consumer Workspace (Databricks)"]
RC["Recipient Catalog"]
Q1["SELECT * FROM shared_catalog..."]
end
subgraph EXT["External Consumer"]
PY["Python / pandas"]
PBI["Power BI"]
end
SH -->|"Databricks-to-Databricks
(automatic)"| RC --> Q1
SH -->|"Open protocol
(activation link)"| PY
SH -->|"Open protocol"| PBI
style SH fill:#3498db,color:white
style RC fill:#2ecc71,color:white
style PY fill:#e74c3c,color:white
style PBI fill:#e74c3c,color:white
Key concepts:
- Share – a named collection of tables (and optionally schemas) that you publish for consumption
- Recipient – an identity that can access a share. Can be another Databricks workspace or an external consumer
- Grant – the permission linking a share to a recipient
The provider never exposes storage credentials. The consumer queries through the Delta Sharing protocol, and Unity Catalog authorizes every request.
Step 1: Prepare the Provider Tables #
First, set up the data you want to share. These tables live in your Unity Catalog:
|
|
Step 2: Create a Share and Add Tables #
|
|
You can also share at the schema level:
|
|
Schema-level sharing is convenient but less controlled. For most use cases, explicit table grants are safer.
Step 3: Set Up Recipients #
Databricks-to-Databricks Recipient #
For sharing between Databricks workspaces in the same account (or with metastore-level sharing enabled):
|
|
The consumer workspace sees the shared tables as a catalog:
|
|
No data was copied. The query goes through the Delta Sharing protocol, the provider’s Unity Catalog authorizes it, and the data is read directly from the provider’s storage.
External Recipient (Non-Databricks) #
For consumers outside Databricks (pandas, Spark OSS, Power BI):
|
|
The activation link is a one-time URL. The recipient opens it, downloads a credentials file (.share profile), and uses it with any Delta Sharing client. The profile file contains a bearer token and the sharing server endpoint – no storage credentials.
|
|
Step 4: Consume from Outside Databricks #
Python / pandas #
Install the Delta Sharing Python connector:
|
|
Read shared tables:
|
|
|
|
Spark OSS #
|
|
Incremental Reads with CDF #
If the shared table has Change Data Feed enabled, consumers can read only what changed:
|
|
This is how you build efficient downstream pipelines over shared data. The consumer doesn’t need to diff the full table – they get the exact rows that were inserted, updated, or deleted.
Step 5: Security Controls #
IP Access Lists #
Restrict which networks can access your shares. IP access lists for recipients are managed via the Databricks SDK or REST API (there is no SQL syntax for this):
|
|
Token Rotation #
Recipient tokens should be rotated periodically. The recipient re-activates with a new link:
|
|
The old token stops working immediately. Coordinate with the recipient before rotating.
Table-Level vs Schema-Level Grants #
Schema-level sharing (ADD SCHEMA) includes all current and future tables. If a sensitive table is added to the schema later, it’s automatically shared. For most production use cases, table-level grants give you tighter control:
|
|
Step 6: Audit Who Accessed What #
Unity Catalog logs every Delta Sharing query in the system tables:
|
|
|
|
|
|
This audit trail is how you answer compliance questions: “Who accessed customer data last month? When? How many times?” All without building custom logging infrastructure.
Gotchas #
You can’t share views. Delta Sharing operates on physical Delta tables. If you need to share a filtered or transformed dataset, materialize it as a table first. This is a common stumbling block for teams that use views for access control – views don’t travel through shares.
Column masking interaction. If a table has column masks (from Unity Catalog fine-grained access control), the mask is applied at the provider side. The recipient sees masked values. This is correct behavior, but it means you need to think about which mask applies – the provider’s mask policy, not the recipient’s.
Sharing across clouds. Delta Sharing works across cloud providers (AWS to Azure, for example), but the latency depends on the data size and network path. For large tables, the first query can be slow because data is read from the provider’s storage. Incremental CDF reads mitigate this for ongoing pipelines.
Recipient token expiry. External recipient tokens don’t expire by default, which is a security concern. Set up a rotation schedule (quarterly is reasonable) and track activation status:
|
|
Schema evolution. If the provider adds a column to a shared table, the consumer sees it on the next query. If the provider removes a column, consumers referencing it break. Communicate schema changes to recipients before deploying them – there’s no built-in schema compatibility negotiation in the protocol.
Conclusion #
Delta Sharing replaces file extracts, credential sharing, and one-off ETL pipelines with a governed, auditable protocol. The provider controls what’s shared and can revoke access instantly. The consumer reads live data without managing storage credentials. The audit trail proves who accessed what and when.
The open protocol means this isn’t a Databricks-only solution. External consumers use the same pandas or Spark interface they already know. The .share profile file is the only credential they need, and it contains no storage keys.
For large-scale data exchange – between internal teams, across workspaces, with external partners – this is how you avoid the “export to S3 and pray” pattern. Zero copies, full governance, real-time access to live tables.