Skip to main content

xdlake

A loose implementation of deltalake, and the deltalake, written in Python on top of pyarrow, focused on extensibility, customizability, and distributed data.

This is mostly inspired by the deltalake package, and is (much) less battle tested. However, it is more flexible given it's Pythonic design. If you're interested give it a shot and maybe even help make it better.

Install

pip install xdlake

Usage

Instantiation

Instantiate a table! This can be a local or remote. For remote, you may need to install the relevant fsspec implementation, for instance s3fs, gcsfs, adlfs for AWS S3, Google Storage, and Azure Storage, respectively.

dt = xdlake.DeltaTable("path/to/my/cool/local/table")
dt = xdlake.DeltaTable("s3://path/to/my/cool/table")
dt = xdlake.DeltaTable("az://path/to/my/cool/table", storage_options=dict_of_azure_creds)

Reads

Read the data. For fancy filtering and predicate push down and whatever, use to_pyarrow_dataset and learn how to filter pyarrow datasets.

ds = dt.to_pyarrow_dataset()
t = dt.to_pyarrow_table()
df = dt.to_pandas()

Writes

Instances of DeltaTable are immutable: any method that performs a table operation will return a new DeltaTable.

Write in-memory data

Write data from memory. Data can be pyarrow tables, datasets, record batches, pandas DataFrames, or iterables of those things.

dt = dt.write(my_cool_pandas_dataframe)
dt = dt.write(my_cool_arrow_table)
dt = dt.write(my_cool_arrow_dataset)
dt = dt.write(my_cool_arrow_record_batches)
dt = dt.write(pyarrow.Table.from_pandas(df))
Import foreign data

Import references to foreign data without copying. Data may be heterogeneously located in s3, gs, azure, and local, and cn be partitioned differently than the DeltaTable itself. Go hog wild.

See Credentials if you need different creds for different storage locations.

Import data from various locations in one go. This only works for non-partitioned data.

dt = dt.import_refs(["s3://some/aws/data", "gs://some/gcp/data", "az://some/azure/data" ])
dt = dt.import_refs(my_pyarrow_filesystem_dataset)

Partitioned data needs to be handled a differently. First, you'll need to read up on pyarrow partitioning to do it. Second, you can only import one dataset at a time.

foreign_partitioning = pyarrow.dataset.partitioning(...)
ds = pyarrow.dataset.dataset(
    list_of_files,
    partitioning=foreign_partitioning,
    partition_base_dir,
    filesystem=xdlake.storage.get_filesystem(foreign_refs_loc),
)
dt = dt.import_refs(ds, partition_by=my_partition_cols)

Deletes

Delete rows from a DeltaTable using pyarrow expressions:

import pyarrow.compute as pc
expr = (
    (pc.field("cats") == pc.scalar("A"))
    |
    (pc.field("float64") > pc.scalar(0.9))
)
dt = dt.delete(expr)
Deletion Vectors

I really want to support deletion vectors, but pyarrow can't filter parquet files by row indices (pretty basic if you ask me). If you also would like xdlake to support deletion vectors, let the arrow folks know by chiming in here.

Clone

You can clone a deltatable. This is a soft clone (no data is copied, and the new table just references the data). The entire version history is preserved. Writes are written to the new location.

cloned_dt = dt.clone("the/location/of/the/clone")

Credentials

DeltaTables that reference distributed data may need credentials for various cloud locations.

To register default credentials for s3, gs, etc.

xdlake.storage.register_default_filesystem_for_protocol("s3", s3_creds)
xdlake.storage.register_default_filesystem_for_protocol("gs", gs_creds)
xdlake.storage.register_default_filesystem_for_protocol("az", az_creds)

To register specific credentials for various prefixes:

xdlake.storage.register_filesystem("s3://bucket-doom/foo/bar", s3_creds)
xdlake.storage.register_filesystem("s3://bucket-zoom/biz/baz", other_s3_creds)
xdlake.storage.register_filesystem("az://container-blah/whiz/whaz", az_creds)

Links

Project home page GitHub
The deltalake transaction log protocol

Bugs

Please report bugs, issues, feature requests, etc. on GitHub.

Gitpod Workspace

launch gitpod workspace

Build Status

main

Metadata

Release files for xdlake 0.0.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xdlake 0.0.10
File Size Uploaded
xdlake-0.0.10.tar.gz 33.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for xdlake 0.0.10
File Interpreter ABI Platform
xdlake-0.0.10-py3-none-any.whl Python 3 none any Details

Total release size: 54.7 kB

Release files / xdlake-0.0.10.tar.gz

Download URL xdlake-0.0.10.tar.gz
Size 33.7 kB
Tags Source
SHA-256 checksum
How to use checksums
cd163273aa8792340ea58c37232be4f2dca8eb336a9c30792f4b85ea78589101
BLAKE2b-256 checksum
How to use checksums
d5898e9f956de6a76867f1b088c64bb5b77650de430d7d1ccdc0c6051b9c59a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / xdlake-0.0.10-py3-none-any.whl

Download URL xdlake-0.0.10-py3-none-any.whl
Size 21.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7ece23b02354424edf74b7da5479230687a04bee3d7d57316e8a3c1adece850f
BLAKE2b-256 checksum
How to use checksums
83f516e51e998fbf00ecb8c04ec580622fd607bee10daeea1ad40434832519e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release history Release notifications | RSS feed

This release

0.0.10 This release

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page