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. There is no marketplace listing to subscribe to and no platform fee: access is provisioned directly against your account.
Who can receive the share today
- The metastore's Delta Sharing scope is
INTERNALtoday. Recipients outside PropRaven's Databricks account cannot receive the share yet. - Open (token) sharing and Databricks-to-Databricks sharing for outside accounts reopen together, when the scope changes and the channel reopens.
- Until then, email sales@propraven.com to join the waitlist. The steps below show how provisioning works once it reopens.
What the share will hold
The live propraven_silver share holds 0 tables and 0 recipients today. The zero-spend rebuild emptied it. It is being rebuilt as external Delta tables stored in PropRaven's Cloudflare R2, so reads carry no egress fee.
When it reopens: one share, one schema, sharing, thirteen tables. That is parcels_wide plus the twelve silver ontology tables. parcels_wide is built from the parcels gateway's current per-state builds (most states 2026-10-12; ID 2026-10-11; CT 2026-10-04-rw1; WI 2026-10-18, as of 2026-10-15). Every table carries its publication epoch in its table comment (epoch=YYYY-MM-DD).
propraven_silver ← the share
└── sharing ← the one schema
├── parcels_wide ← 620 columns, one row per parcel (about 264.9M rows)
├── parcel ← canonical parcel spine
├── property ← structure + assessment attributes
├── address ← 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 ← multi-year assessment + levy history
├── owner ← resolved owner entities
├── transaction ← deed union: recorded title transfers
├── loan ← recorded mortgage instruments
├── geography ← Census hierarchy: tract, county, CBSA
└── occupant ← commercial occupants (own refresh cadence)Row counts are not printed here because the rebuild will change them. Read them from the share once it reopens.
Plans. The grant admits a Team plan, the grandfathered Business plan, or a Data License (sales-led, set on your account). Other plans get 402. /pricing lists Databricks delivery under the Data License.
0% platform fee. 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 (when the channel reopens)
While the channel is paused, this call returns 503 with a waitlist message and creates nothing. Once it reopens, 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. A signed-out call gets 401.
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=YYYY-MM-DD
-- 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-sharingimport 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 table
)
print(df.shape)
# 3. Push the filter down instead of pulling the whole table 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 share's 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 withDESCRIBE TABLE EXTENDEDor in Catalog Explorer, and pin your reconciliation to it rather than to wall-clock time. - Release status. The channel is paused as of 2026-10-15. When it reopens, the share follows the parcel builds; a new epoch replaces the old one in place, with no re-subscribe step.
- Older counts. Row counts published for this share before the rebuild (for example 228.8M parcel rows) were measured on the 2026-08 epoch. They do not describe the rebuilt share.
transactionis the deed union. Recorded title transfers assembled from recorder-of-deeds sources: arms-length sales, quitclaims, and the rest of the recorded chain, not a listings feed.