Lance: A Lakehouse Format Built for Multimodal AI Workloads
Open Lakehouse Format for Multimodal AI. Convert from Parquet in 2 lines of code for 100x faster random access, vector index, and data versioning. Compatible with Pandas, DuckDB, Polars, Pyarrow, and PyTorch with more integrations coming..
At a glance
- What is it?
- Lance is an open source lakehouse format that combines vector search, full-text search, and SQL analytics on a single dataset. It promises 100x faster random access than Parquet or Iceberg, with zero-copy versioning and native support for images, video, and audio.
- Who is it for?
- Adopt Lance if you are building search engines, feature stores, or ML training pipelines that need fast random access, hybrid search, and time travel on object storage. Avoid it if your team is not ready to track frequent SDK releases and pin a stable data_storage_version.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- lance-format/lance7,303 ★ · +399
| Repository | 2026-08-04 | 2026-11-14 |
|---|---|---|
| lance-format/lance | 6.9k | 7.3k |
399 Stars in the last 102 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The Problem: Multimodal Data in a Lakehouse
Standard lakehouse formats like Parquet and Iceberg were designed for tabular data, not for the mix of embeddings, images, video, and text that powers modern AI. Random access to individual rows in Parquet is slow because the format is columnar and optimized for full scans. Vector search requires a different access pattern, and versioning often needs extra infrastructure. Lance addresses this by defining a file format, table format, and catalog spec that sit on top of object storage. It is aimed at teams building search engines, feature stores, and large-scale ML training pipelines. The README lists three use cases: hybrid search, high-performance IO with random access, and storing multimodal data in one place. That last point is the key differentiator. You can keep embeddings and raw media in the same dataset, which avoids the usual split between a vector database and a data lake.
How Lance Works: File Format, Indexes, and Versioning
Lance is implemented in Rust, with Python bindings via PyO3 and Java bindings via JNI. The core is a columnar format, but it adds structures that Parquet lacks. The most important is the ability to create secondary indexes, including IVF_PQ for vector similarity and BM25 for full-text search. The README shows a vector index being built with create_index, passing index_type="IVF_PQ", num_partitions, and num_sub_vectors. This index is stored alongside the data, so search and SQL analytics can operate on the same dataset. Versioning is zero-copy: each write creates a new version, and you can time travel, tag, or branch without duplicating data. The file format version is stored in each dataset as data_storage_version, which is a long-term compatibility contract. This design means you get ACID transactions and versioning without running a separate metadata service.
Getting Started: Two Lines from Parquet
The README promises conversion from Parquet in two lines of code. The example uses PyArrow to read a Parquet dataset and then calls lance.write_dataset(parquet, "/tmp/test.lance"). The dataset can then be read with lance.dataset, which returns an object that is an instance of pa.dataset.Dataset. That means you can use it with Pandas via to_table().to_pandas(), or with DuckDB by passing the dataset object directly into a SQL query. The vector search example downloads SIFT1M, converts the raw binary vectors to a table with vec_to_table, and writes it with max_rows_per_group and max_rows_per_file parameters. The index creation and search are separate steps, which is a good separation of concerns. Installation is pip install pylance, with preview releases available from a separate index. The README notes that preview releases are published more often and are guaranteed to remain available for at least six months.
The Performance Claim: 100x Faster Random Access
The headline claim is 100x faster random access than Parquet or Iceberg, without sacrificing scan performance. The README states this in bold, and it has a Benchmarks section on vector search. This is a claim you should verify with your own workload before committing. The trade-off is that the format is more complex, and the index structures add storage overhead. If your workload is mostly full scans, the benefit may be smaller. The README also warns that older Lance releases may not understand newer file format versions, so if you run mixed Lance versions you should pin data_storage_version for deterministic writes. That is a real operational constraint.
A Real Limitation: Version Compatibility and API Churn
Lance releases frequently, and the README is explicit about the consequences. The file format is stable once you write with a stable data_storage_version, but SDK and API compatibility follows semantic versioning and can change. The migration guide exists for a reason. If you run mixed Lance versions, you must pin data_storage_version. The "next" file format alias is unstable and is for experimentation only. This means that a production deployment requires careful version management. The README also notes that the DuckDB integration can segfault if you have a version below 0.7, which suggests the integration is sensitive to dependency versions. These are not fatal flaws, but they mean Lance is not a set-and-forget format. You need to track releases and test upgrades. For a team that values stability above all, this is a significant cost.
The Alternative: Parquet with a Vector Index Layer
The obvious alternative is to keep Parquet as the storage format and add a separate vector index, such as FAISS or an external vector database. That approach separates concerns: Parquet handles scans and analytics, and the vector index handles similarity search. The difference is that you must manage two systems and keep them in sync. Lance collapses that into one format. The trade-off is that Lance is younger and less battle-tested than Parquet, and its ecosystem integrations are still growing. The README lists Apache Arrow, Pandas, Polars, DuckDB, Apache Spark, Ray, Trino, and Apache Flink, and the README says more integrations are on the way. If you need a vector database with a rich query language and mature tooling, a dedicated system might be a better fit. If you want a single source of truth for your data and embeddings, Lance's approach is more direct.
Maintenance and Upgrade Cost
The maintenance cost is tied to the release cadence and the versioning contract. The README states that stable storage versions are a long-term compatibility contract, so data written with a stable version will remain readable by future releases. That reduces the risk of data lock-in. However, SDK and API changes follow semantic versioning, so code that uses the Python API may need updates. The migration guide is the place to check. The file format versioning guide provides a compatibility matrix. The project is under active development, with recent beta releases (v15.0.0-beta.7 on 2026-10-29 and v15.0.0-beta.8 on 2026-11-02) coming days apart. That is a sign of fast iteration, but also of churn. The license is Apache-2.0, which is permissive and does not impose copyleft obligations. Apache-2.0 permits use in proprietary products. The project is not archived, and the last push is recent, so it is actively maintained.
Editorial conclusion
Adopt Lance if you are building search engines, feature stores, or ML training pipelines that need fast random access, hybrid search, and time travel on object storage. Avoid it if your team is not ready to track frequent SDK releases and pin a stable data_storage_version. Before production, verify the compatibility matrix for your storage version and confirm that the integrations you rely on (DuckDB, Spark, Ray) are supported in your deployment. Also check the migration guide, because SDK and API changes follow semantic versioning and may require code updates.
Frequently asked questions
How do I convert a Parquet dataset to Lance?
Call lance.write_dataset with the Parquet dataset object and an output path, then reopen it with lance.dataset. The result passes isinstance(dataset, pa.dataset.Dataset), so Arrow code can keep treating it as a dataset.
What does Lance use as its vector index type in the quick start?
It creates an IVF_PQ index on a column named vector, with num_partitions=256 for the IVF stage and num_sub_vectors=16 for the product quantizer. Search then passes a nearest argument with a column name, a k, and a query vector to dataset.to_table.
Is Lance safe to use with production data right now?
Pin a stable data_storage_version when you write, since future releases keep reading that version and older releases may not understand newer ones. The next alias is unstable and reserved for experimentation, never production data.
How do I install a preview build of Lance?
Use pip install --pre with the extra index URL pointing at the project's Fury repository. Preview releases ship more often, get the same level of testing, and are guaranteed to stay downloadable for at least six months, but the project advises preferring a stable release when you pin a version.
What integrations does Lance support?
The named integrations are Apache Arrow, Pandas, Polars, DuckDB, Apache Spark, Ray, Trino, Apache Flink, and catalogs including Apache Polaris, Unity Catalog, and Apache Gravitino. Only the Pandas and DuckDB paths have worked code in the quick start.
What does Lance not document?
The quick start shows no rollback, row level delete, update, or compaction command; the README points to the Lance format specification and the format versioning guide for details.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/lance-format-lance)Star history chart for your README
[](https://hysenlabs.com/projects/lance-format-lance)Was this useful?