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
SessionConfigis not propagated to Ballista. - Ballista-specific configuration cannot be set.
- Anything requiring custom
datafusion_proto::logical_plan::LogicalExtensionCodec. - No support for
UDFas 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 graphvizon 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 queriesdataframe_api.ipynb- DataFrame transformationsdistributed_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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8de4faba3df7b07b29d2a86ef5cd0a2ae7b08e762762feeafc62709a6a8783f
|
|
| MD5 |
8b3558a44f631fd9f9cbcdd1b0c85c37
|
|
| BLAKE2b-256 |
6a61502727bbe355a7827244d14654fddbfa2d288d1679d6a204cd75d91724f2
|
File details
Details for the file ballista-54.0.0-cp310-abi3-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ballista-54.0.0-cp310-abi3-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 58.4 MB
- Tags: CPython 3.10+, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c84de4282b1ebfdeeac33f12c724b33a8d5f394f27146d45257dea4dcbc3368a
|
|
| MD5 |
a1f3d9e5197a1c654ab415a97667c695
|
|
| BLAKE2b-256 |
2ab947a68a7f7f1ac276ee196894a4d36269f9e36042a5252b488c8c71b43b4d
|
File details
Details for the file ballista-54.0.0-cp310-abi3-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: ballista-54.0.0-cp310-abi3-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 55.8 MB
- Tags: CPython 3.10+, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
914597cfed0585fe761b6b6767801845ae9d9cc013b4913b26a38299cc26959d
|
|
| MD5 |
cc99d44a2f2f01782222e45f7c7689be
|
|
| BLAKE2b-256 |
86bdedf65fba1ddc9f2e8c1bc6bb8f53799333d3dccaf9ff4a2f9fac9cb96448
|
File details
Details for the file ballista-54.0.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: ballista-54.0.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 53.3 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2713721b3b43512b955a4158a3844359e24925666b47d53fd6e38526f9666876
|
|
| MD5 |
b8695784788787ac41f431918283ebf0
|
|
| BLAKE2b-256 |
c4f6aa5a8531af6740e7e3e97e634dca14ce31ffcb402004856e991554f51235
|