Skip to main content

Read Delta Lake tables, transform with SQL, and load into SQL Server

Project description

Delta Funnel

Surreal banner showing Delta Lake data flowing through a Rust-orange funnel into a database barrel.

Move Delta Lake data into SQL Server without Spark or ODBC.

A lightweight Rust and Python toolkit for reading Delta Lake tables,
transforming them with SQL, and bulk-loading through a native TDS driver.

Built in Rust. Python API included.

Rust docs crates.io PyPI Python 3.10+

[!NOTE] Delta Funnel is early project code. The Rust crate is available on crates.io, and the Python package is available on PyPI.

When To Use It

Use Delta Funnel when you need to:

  • Read Delta Lake tables from local paths or object-store URIs.
  • Transform rows with DataFusion SQL.
  • Load one or more results into Microsoft SQL Server.
  • Use native TDS bulk writes designed to be significantly faster than ODBC-based loads.
  • Run the workflow from Rust or from a PyO3 native extension module in Python.
  • Avoid standing up Spark for a focused Delta Lake to SQL Server pipeline.

Install Or Build

For Rust, add the delta-funnel crate:

cargo add delta-funnel

For Python, add the deltafunnel package:

uv add deltafunnel

Python Quickstart

from deltafunnel import Session

connection_string = (
    "server=tcp:localhost,1433;"
    "database=warehouse;"
    "user id=etl_user;"
    "password=REPLACE_ME;"
    "encrypt=true;"
    "TrustServerCertificate=yes"
)

session = Session(default_mssql_connection_string=connection_string)
orders = session.delta_lake("file:///path/to/orders-delta", name="orders")

daily_orders = session.table_from_sql("""
    select customer_id, order_date, total_amount
    from orders
    where order_date >= date '2026-01-01'
""")

report = daily_orders.write_to_mssql(
    schema="dbo",
    table="daily_orders",
    load_mode="create_and_load",
)

session.delta_lake(..., name="orders") registers a Delta source immediately. session.delta_lake(...) without name returns a pending source; call .alias("orders") before SQL references it.

Reports are plain Python dict values converted from Rust report types. Report formatting is designed to avoid exposing connection strings, credentials, and raw row values. See docs/failure-reports-and-tracing.md for the failure-report and tracing rules.

Dry Runs

Use dry_run=True on the same write methods to validate the plan without writing rows:

dry_run_report = daily_orders.write_to_mssql(
    schema="dbo",
    table="daily_orders",
    load_mode="create_and_load",
    dry_run=True,
)

There are no public Python dry_run_* methods.

Multi-output Writes

Table.to_mssql(...) creates an output spec without writing. Session.write_all writes the specs in one workflow.

active_orders = session.table_from_sql("""
    select *
    from orders
    where status = 'active'
""").alias("active_orders")

west = session.table_from_sql("""
    select * from active_orders where region = 'west'
""")
east = session.table_from_sql("""
    select * from active_orders where region = 'east'
""")

outputs = [
    west.to_mssql(
        schema="dbo",
        table="active_orders_west",
        load_mode="append_existing",
        name="west_active_orders",
    ),
    east.to_mssql(
        schema="dbo",
        table="active_orders_east",
        load_mode="append_existing",
        name="east_active_orders",
    ),
]

dry_run_report = session.write_all(outputs, dry_run=True)
report = session.write_all(outputs, options={"cache_mode": "disabled"})

options={"cache_mode": "auto"} is the default execute behavior. It may cache shared lazy SQL aliases during one write_all call. Use options={"cache_mode": "disabled"} to force the baseline path.

[!IMPORTANT] options is only accepted for execute write_all calls, not dry runs.

The first Python surface does not include persistent cache, persist, or materialize APIs.

Rust API

The Rust crate owns the workflow implementation and public report types. A minimal dry-run example is available at crates/delta-funnel/examples/query_load_dry_run.rs.

Run it with a local Delta table path:

DELTA_FUNNEL_EXAMPLE_ORDERS_DELTA=/path/to/orders \
  cargo run -p delta-funnel --example query_load_dry_run

Core Rust entry points include:

  • DeltaFunnelSession for source registration and session state.
  • DeltaFunnelRuntime for lazy SQL planning, dry runs, and writes.
  • OutputWritePlan and MssqlOutputTarget for output planning.
  • WriteAllOptions and WriteAllCacheMode for multi-output execution.

Build And Test

cargo fmt --all --check
cargo check --workspace
cargo test --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings

SQL Server integration tests are opt-in:

cargo xtask sqlserver-test

The xtask runner can start a local SQL Server container, run Rust and Python write tests, and remove the container when it exits. See docs/mssql-integration-tests.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

deltafunnel-0.1.1-cp310-abi3-win_amd64.whl (41.2 MB view details)

Uploaded CPython 3.10+Windows x86-64

deltafunnel-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl (49.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

deltafunnel-0.1.1-cp310-abi3-macosx_11_0_arm64.whl (42.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

deltafunnel-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl (44.1 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file deltafunnel-0.1.1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: deltafunnel-0.1.1-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 41.2 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for deltafunnel-0.1.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 83fd15e87b8ba3e504b1d5b891a1ea39872c4c05fcd7e52c3f8b4afac8e95d68
MD5 f151967a237864e0c8b79a12166df70a
BLAKE2b-256 1e6c6fb3698b8a25868f34d32419ecd657a0c49ce7caa87e23b148aa37ea1561

See more details on using hashes here.

Provenance

The following attestation bundles were made for deltafunnel-0.1.1-cp310-abi3-win_amd64.whl:

Publisher: pypi.yml on mag1cfrog/delta-funnel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file deltafunnel-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for deltafunnel-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ffbf49f4b040e937c11ce114884adeb51fae43f4c01119a0ed503cad18cd00d4
MD5 9fbfe911e08a05fc443b0a5c01959153
BLAKE2b-256 f9ad49600f9385f79673bc425757c558d0e357358a0d2bd410e630406075c42c

See more details on using hashes here.

Provenance

The following attestation bundles were made for deltafunnel-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on mag1cfrog/delta-funnel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file deltafunnel-0.1.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for deltafunnel-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 39277a2b52dc8cf13a5c2298ca3b7402bf8be1cd5628bb1a6f781d851628abd4
MD5 0f4e35ca32ae93be433af4a45c9b340f
BLAKE2b-256 ff9d04c17f24d8c98f9916494016bb36b89210ddf0c3f7bab2d8733570db8c75

See more details on using hashes here.

Provenance

The following attestation bundles were made for deltafunnel-0.1.1-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: pypi.yml on mag1cfrog/delta-funnel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file deltafunnel-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for deltafunnel-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 68c0a1428b88ca9f134e52d97b6a0ec9aad24e9564bbb37c533095863ec9a546
MD5 21eb93016de3b94506ce91d3d0fb9daa
BLAKE2b-256 5ca72f361b92803f0b7270b53db577f488e308a7e0ad68707575b3b24e1ddf20

See more details on using hashes here.

Provenance

The following attestation bundles were made for deltafunnel-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: pypi.yml on mag1cfrog/delta-funnel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page