Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - uberall/data-sharing-code-examples: Reference scripts to be used alongside Uberall data sharing · GitHub
Skip to content

Repository files navigation

Delta Sharing to PostgreSQL — Ingestion Script

A reference Python script that reads data from a Databricks Delta Sharing table and ingests it into a PostgreSQL database.

This is intended for customers who want to consume Delta Sharing data in systems that do not natively support the Delta format.

Prerequisites

  • Python 3.9+
  • Docker (for local testing with the included compose.yaml)
  • PostgreSQL instance with write access (or use the Docker setup below)
  • Delta Sharing profile file (.share) — a JSON credential file provided by your data provider. It looks like this:
{
"shareCredentialsVersion": 1,
"endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
"bearerToken": "<your-token>"
}

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure the script

Open delta_sharing_to_postgres.py and edit the USER CONFIGURATION section at the top:

VariableDescription
DELTA_SHARING_PROFILE_PATHPath to your .share profile file
DELTA_SHARING_TABLEFully qualified table name: <share>.<schema>.<table>
PG_HOSTPostgreSQL host
PG_PORTPostgreSQL port (default 5432)
PG_DATABASETarget database name
PG_USERDatabase user
PG_PASSWORDDatabase password
PG_TARGET_SCHEMATarget schema (default public)
PG_TARGET_TABLETarget table name
WRITE_MODEreplace, append, or fail

3. Run the script

python delta_sharing_to_postgres.py

The script will:

  1. Connect to Delta Sharing and list available tables.
  2. Read the specified table into memory.
  3. Print a preview of the first 5 rows.
  4. Write the data to your PostgreSQL instance.
  5. Validate the row count in the target table.

Write Modes

ModeBehavior
replaceDrops and recreates the target table on every run.
appendAdds rows to the existing table (no deduplication).
failAborts if the target table already exists.

Local Testing with Docker

A compose.yaml is included so you can spin up a PostgreSQL instance locally for testing.

1. Start the database

docker compose up -d

This starts two services:

ServiceDescriptionAccess from host
dbPostgreSQL 16localhost:5432

2. Verify the database is ready

docker compose logs db

Look for database system is ready to accept connections in the output.

3. Test connectivity from the command line

docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

If this prints a table with 1, the database is working.

4. Connect from DataGrip/DBeaver

Create a new PostgreSQL data source in DataGrip/DBeaver with these settings:

SettingValue
Hostlocalhost
Port5432
Databasetestdb
Userpostgres
Passwordexample

Click Test Connection — it should succeed. If it fails:

  • Make sure the containers are running: docker compose ps
  • Make sure nothing else is using port 5432: ss -tlnp | grep 5432
  • Check the container logs: docker compose logs db

5. Run the script

The default configuration in delta_sharing_to_postgres.py already matches the Docker setup. Just set your DELTA_SHARING_PROFILE_PATH and DELTA_SHARING_TABLE, then run:

python delta_sharing_to_postgres.py

6. Stop and clean up

# Stop containers (data is preserved in a Docker volume)
docker compose down
# Stop and delete all data
docker compose down -v

Security Considerations

  • Never commit your .share profile file to version control. It contains a bearer token that grants access to shared data. Add *.share to your .gitignore.
  • Avoid hardcoding passwords in the script for production use. Consider using environment variables or a secrets manager instead.
  • Restrict file permissions on the .share file (chmod 600 profile.share on Linux/macOS).

Customization

This script is a starting point. Common adaptations include:

  • Column mapping or transformation — modify the DataFrame between the read and write steps.
  • Incremental ingestion — filter by a timestamp column to load only new data.
  • Different target databases — swap the SQLAlchemy connection string and driver (e.g., mysql+pymysql:// for MySQL).
  • Scheduling — wrap the script in a cron job, Airflow DAG, or other orchestrator.

Troubleshooting

ProblemSolution
FileNotFoundError on the profileVerify DELTA_SHARING_PROFILE_PATH points to a valid .share file.
HTTPError 401/403Your bearer token may be expired or invalid. Request a new profile from your data provider.
psycopg2.OperationalErrorCheck your PostgreSQL connection parameters and ensure the database is reachable.
Empty DataFrameVerify the table name is correct by checking the logged list of available tables.

About

Reference scripts to be used alongside Uberall data sharing

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages