Skip to main content

Python client for Apache Arrow Ballista Distributed SQL Query Engine

Project description

Ballista

Ballista support for datafusion python.

This project is tracked under its own Cargo.toml and is intentionally not part of the default Cargo workspace so that it doesn't cause overhead for maintainers of the main Ballista codebase. Its version is bumped in lockstep with the workspace crates by dev/update_ballista_versions.py, and the wheels are built against the in-repo ballista crates via path dependencies (not crates.io), so an RC can produce wheels for an unpublished version.

Creating a SessionContext

[!IMPORTANT] Current approach is to support datafusion python API, there are know limitations of current approach, with some cases producing errors.

We are trying to come up with the best approach to support ballista python interface.

More details could be found at #1142

Creates a new context which connects to a Ballista scheduler process.

from datafusion import col, lit
from datafusion import DataFrame
# we do not need datafusion context
# it will be replaced by BallistaSessionContext
# from datafusion import SessionContext
from ballista import BallistaSessionContext

# Change from:
#
# ctx = SessionContext()
#
# to: 

ctx = BallistaSessionContext("df://localhost:50050")

# all other functions and functions are from
# datafusion module
ctx.sql("create external table t stored as parquet location './testdata/test.parquet'")
df : DataFrame = ctx.sql("select * from t limit 5")

df.show()

Known limitations and inefficiencies of the current approach:

  • The client's SessionConfig is not propagated to Ballista.
  • Ballista-specific configuration cannot be set.
  • Anything requiring custom datafusion_proto::logical_plan::LogicalExtensionCodec.
  • No support for UDF as DataFusion Python does not serialise them.
  • A Ballista connection will be created for each request.

Example DataFrame Usage

ctx = BallistaSessionContext("df://localhost:50050")
df = ctx.read_parquet('./testdata/test.parquet').filter(col(id) > lit(4)).limit(5)

pyarrow_batches = df.collect()

Check DataFusion python provides more examples and manuals.

Jupyter Notebook Support

PyBallista provides first-class Jupyter notebook support with SQL magic commands and rich HTML rendering.

Install Jupyter extras first:

pip install "ballista[jupyter]"

HTML Table Rendering

DataFrames automatically render as styled HTML tables in Jupyter notebooks:

from ballista import BallistaSessionContext

ctx = BallistaSessionContext("df://localhost:50050")
df = ctx.sql("SELECT * FROM my_table LIMIT 10")
df  # Renders as HTML table via _repr_html_()

SQL Magic Commands

For a more interactive SQL experience, load the Ballista Jupyter extension:

# Load the extension
%load_ext ballista.jupyter

# Connect to a Ballista cluster
%ballista connect df://localhost:50050

# Register .parquet table
%register parquet public.test_data_v1 ../testdata/test.parquet

# Check connection status
%ballista status

# List registered tables
%ballista tables

# Show table schema
%ballista schema my_table

# Execute a simple query (line magic)
%sql SELECT COUNT(*) FROM orders

# Execute a complex query (cell magic)
%%sql
SELECT
    customer_id,
    SUM(amount) as total
FROM orders
GROUP BY customer_id
ORDER BY total DESC
LIMIT 10

You can also store results in a variable:

%%sql my_result
SELECT * FROM orders WHERE status = 'pending'

Execution Plan Visualization

Visualize query execution plans directly in notebooks:

df = ctx.sql("SELECT * FROM orders WHERE amount > 100")
df.explain_visual()  # Displays SVG visualization

# With runtime statistics
df.explain_visual(analyze=True)

Note: Full SVG visualization requires graphviz to be installed (brew install graphviz on macOS).

Progress Indicators

For long-running queries, use collect_with_progress() to see execution status:

df = ctx.sql("SELECT * FROM large_table")
batches = df.collect_with_progress()

Example Notebooks

See the examples/ directory for Jupyter notebooks demonstrating various features:

  • getting_started.ipynb - Basic connection and queries
  • dataframe_api.ipynb - DataFrame transformations
  • distributed_queries.ipynb - Multi-stage distributed query examples

Scheduler and Executor

Scheduler and executors can be configured and started from python code.

To start scheduler:

from ballista import BallistaScheduler

scheduler = BallistaScheduler()

scheduler.start()
scheduler.wait_for_termination()

For executor:

from ballista import BallistaExecutor

executor = BallistaExecutor()

executor.start()
executor.wait_for_termination()

Development Process

Detailed development process explanation can be found in datafusion python documentation. Improving build speed section can be relevant.

Creating Virtual Environment

pip

python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt

uv

uv sync --dev --no-install-package ballista

Developing & Building

pip

maturin develop

Note that you can also run maturin develop --release to get a release build locally.

uv

uv run --no-project maturin develop --uv

Or uv run --no-project maturin build --release --strip to get a release build.

Testing

pip

python3 -m pytest

uv

uv run --no-project pytest

Project details


Download files

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

Source Distribution

ballista-54.0.0.tar.gz (518.0 kB view details)

Uploaded Source

Built Distributions

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

ballista-54.0.0-cp310-abi3-manylinux_2_39_x86_64.whl (58.4 MB view details)

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

ballista-54.0.0-cp310-abi3-manylinux_2_39_aarch64.whl (55.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.39+ ARM64

ballista-54.0.0-cp310-abi3-macosx_11_0_arm64.whl (53.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file ballista-54.0.0.tar.gz.

File metadata

  • Download URL: ballista-54.0.0.tar.gz
  • Upload date:
  • Size: 518.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for ballista-54.0.0.tar.gz
Algorithm Hash digest
SHA256 b8de4faba3df7b07b29d2a86ef5cd0a2ae7b08e762762feeafc62709a6a8783f
MD5 8b3558a44f631fd9f9cbcdd1b0c85c37
BLAKE2b-256 6a61502727bbe355a7827244d14654fddbfa2d288d1679d6a204cd75d91724f2

See more details on using hashes here.

File details

Details for the file ballista-54.0.0-cp310-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ballista-54.0.0-cp310-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 c84de4282b1ebfdeeac33f12c724b33a8d5f394f27146d45257dea4dcbc3368a
MD5 a1f3d9e5197a1c654ab415a97667c695
BLAKE2b-256 2ab947a68a7f7f1ac276ee196894a4d36269f9e36042a5252b488c8c71b43b4d

See more details on using hashes here.

File details

Details for the file ballista-54.0.0-cp310-abi3-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for ballista-54.0.0-cp310-abi3-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 914597cfed0585fe761b6b6767801845ae9d9cc013b4913b26a38299cc26959d
MD5 cc99d44a2f2f01782222e45f7c7689be
BLAKE2b-256 86bdedf65fba1ddc9f2e8c1bc6bb8f53799333d3dccaf9ff4a2f9fac9cb96448

See more details on using hashes here.

File details

Details for the file ballista-54.0.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ballista-54.0.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2713721b3b43512b955a4158a3844359e24925666b47d53fd6e38526f9666876
MD5 b8695784788787ac41f431918283ebf0
BLAKE2b-256 c4f6aa5a8531af6740e7e3e97e634dca14ce31ffcb402004856e991554f51235

See more details on using hashes here.

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