Distribution · Databricks Delta Sharing

PropRaven Delta Sharing

One share, every reader. Delta Sharing is an open protocol, so the same propraven_silver share a Databricks workspace mounts as a catalog is also readable from plain Python, PySpark, Power BI, or Tableau — no Databricks account required on your side. There is no marketplace listing to subscribe to and no platform fee: access is provisioned directly against your account.

What's in the share

One share, propraven_silver, one schema, sharing, eleven tables. Every table carries its publication epoch in its table comment (epoch=YYYY-MM-DD), so the vintage travels with the data rather than living in a changelog you have to go read.

propraven_silver                     ← the share
└── sharing                          ← the one schema
    ├── parcel               228.8M  ← canonical parcel spine
    ├── property                     ← structure + assessment attributes
    ├── address              143.0M  ← normalized situs + mailing addresses
    ├── absentee                     ← owner-occupancy classification
    ├── parcel_extensions            ← wide enrichment columns, parcel-keyed
    ├── recent_transfer              ← most recent qualifying sale per parcel
    ├── tax_record           293.1M  ← multi-year assessment + levy history
    ├── owner                 27.5M  ← resolved owner entities
    ├── transaction           10.5M  ← deed union — recorded title transfers
    ├── loan                         ← recorded mortgage instruments
    ├── geography                    ← Census hierarchy: tract → county → CBSA
    └── occupant                     ← 14.5M commercial occupants (refreshes weekly on its own epoch)

0% platform fee. Delta Sharing access is included with a Team plan, or with a data license. Databricks takes nothing out of the middle — you pay only your own compute, and if you read from outside Databricks (the Python or PySpark path below) there is no Databricks bill at all.

Get access

One call provisions your recipient and grants it SELECT on the share. It is session-authenticated — the same sign-in as the app, not an API key — so call it from a signed-in browser session or pass your session cookie to curl.

Databricks-to-Databricks — send your sharing identifier and the share appears directly in your own metastore. Find it in your workspace under Catalog → Delta Sharing → Shared with me; it looks like aws:us-east-2:<uuid>.

curl -X POST https://propraven.com/api/v1/data/databricks/grant \
  -H "Content-Type: application/json" \
  -b "$PROPRAVEN_SESSION_COOKIE" \
  -d '{"sharing_identifier": "aws:us-east-2:19a84bee-54bc-43a2-87de-023d0ec16016"}'

# Response — nothing to download; the share shows up in your metastore
{
  "recipient": "cust_9f2c1ab34de5f607",
  "share": "propraven_silver",
  "authentication_type": "DATABRICKS",
  "activation_url": null,          ← D2D authenticates metastore-to-metastore
  "already_existed": false,
  "docs": "https://propraven.com/docs/databricks"
}

Open sharing — send no body at all. You get a one-time activation_url; open it in a browser to download the credential file (.share) that every non-Databricks client below reads.

curl -X POST https://propraven.com/api/v1/data/databricks/grant \
  -H "Content-Type: application/json" \
  -b "$PROPRAVEN_SESSION_COOKIE"

# Response
{
  "recipient": "cust_9f2c1ab34de5f607",
  "share": "propraven_silver",
  "authentication_type": "TOKEN",
  "activation_url": "https://<workspace>/delta_sharing/retrieve_config.html?...",
  "already_existed": false,
  "docs": "https://propraven.com/docs/databricks"
}

The call is idempotent: your recipient name is derived from your account, so a second call returns the same recipient with already_existed: true rather than piling up duplicates. Optional recipient_suffix gives you a second named recipient (e.g. one per warehouse).

Rotate a credential

An activation link is single-use. Once it has been redeemed, a repeat provisioning call returns activation_url: null — correct, but not what you want if the credential file was lost or leaked. Send rotate instead: it mints a fresh activation link on the existing recipient and expires the outgoing token immediately.

curl -X POST https://propraven.com/api/v1/data/databricks/grant \
  -H "Content-Type: application/json" \
  -b "$PROPRAVEN_SESSION_COOKIE" \
  -d '{"rotate": true}'

# Response
{
  "recipient": "cust_9f2c1ab34de5f607",
  "share": "propraven_silver",
  "authentication_type": "TOKEN",
  "activation_url": "https://<workspace>/delta_sharing/retrieve_config.html?...",
  "already_existed": true,
  "rotated": true,
  "docs": "https://propraven.com/docs/databricks"
}
  • Rotation never creates. If you have not provisioned yet, it 404s — POST with an empty body first.
  • Rotation is open-sharing only. A Databricks-to-Databricks recipient has no token to rotate and returns 400; revoke that access from your own workspace instead.
  • Any credential file downloaded from the old link stops working at once.

Read it from Databricks

After a Databricks-to-Databricks grant the share appears under Catalog → Shared with me. Mount it once as a catalog, then it is ordinary SQL — no connector, no copy, no refresh job.

-- 1. Mount the share as a catalog (once, from a SQL warehouse or notebook).
--    <provider> is the provider name shown under Shared with me.
CREATE CATALOG IF NOT EXISTS propraven
USING SHARE `<provider>`.`propraven_silver`;

-- 2. Query it like any other table
SELECT count(*) FROM propraven.sharing.parcel;

-- 3. Check the vintage — the epoch rides on the table comment
DESCRIBE TABLE EXTENDED propraven.sharing.parcel;   -- Comment: epoch=2026-08-02

-- 4. Recorded title transfers against the parcel spine
SELECT p.county_fips,
       count(*)             AS transfers,
       median(t.sale_price)  AS median_price
FROM   propraven.sharing.parcel      p
JOIN   propraven.sharing.transaction t USING (prpv_parcel_id)
WHERE  p.state_fips = '37'
  AND  t.recorded_date >= '2025-01-01'
GROUP  BY p.county_fips
ORDER  BY transfers DESC
LIMIT  25;

Read it from Python

No Databricks account needed — the open-sharing credential file is all the delta-sharing client wants. Table paths are <profile>#<share>.<schema>.<table>.

pip install delta-sharing
import json
import delta_sharing

# The file you downloaded from activation_url. Treat it like a secret —
# it is a bearer credential; rotate it if it ever leaves your control.
profile = "propraven.share"

# 1. See what you have access to
client = delta_sharing.SharingClient(profile)
for t in client.list_all_tables():
    print(f"{t.share}.{t.schema}.{t.name}")
# → propraven_silver.sharing.parcel
# → propraven_silver.sharing.transaction
# → ...

# 2. Load a table into pandas
df = delta_sharing.load_as_pandas(
    f"{profile}#propraven_silver.sharing.parcel",
    limit=10_000,          # omit for the full 228.8M-row table
)
print(df.shape)

# 3. Push the filter down instead of pulling 228.8M rows across the wire
nc = delta_sharing.load_as_pandas(
    f"{profile}#propraven_silver.sharing.parcel",
    jsonPredicateHints=json.dumps({
        "op": "equal",
        "children": [
            {"op": "column",  "name": "state_fips", "valueType": "string"},
            {"op": "literal", "value": "37",        "valueType": "string"},
        ],
    }),
)

Read it from PySpark

Same credential file, same table paths — the deltaSharing reader streams the Parquet directly to your executors.

# spark-submit --packages io.delta:delta-sharing-spark_2.12:3.1.0 ...

parcels = (
    spark.read.format("deltaSharing")
    .load("/dbfs/propraven.share#propraven_silver.sharing.parcel")
)

transfers = (
    spark.read.format("deltaSharing")
    .load("/dbfs/propraven.share#propraven_silver.sharing.transaction")
)

(
    parcels.filter("state_fips = '37'")
    .join(transfers, "prpv_parcel_id", "left")
    .groupBy("county_fips")
    .count()
    .orderBy("count", ascending=False)
    .show()
)

Power BI & Tableau

Both ship a native Delta Sharing connector — point it at the same .share credential file from your activation download and the eleven tables appear as sources. Nothing PropRaven-specific to install.

Freshness & semantics

  • Epoch on every table. The table comment carries epoch=YYYY-MM-DD — the canonical build the table was cut from. Read it with DESCRIBE TABLE EXTENDED or in Catalog Explorer, and pin your reconciliation to it rather than to wall-clock time.
  • Weekly canonical cadence. The share is republished on the same weekly canonical build as our other delivery channels. A new epoch replaces the old one in place; there is no re-subscribe step.
  • Counts are floor-verified. Every row count published here is measured on the built artifact before release and rounded down — 228.8M parcels means at least 228.8M parcels, never an estimate reached upward.
  • transaction is the deed union. 10.5M recorded title transfers assembled from recorder-of-deeds sources — arms-length sales, quitclaims, and the rest of the recorded chain, not a listings feed.