Skip to content

Lance Namespace Client Spec

The Lance Namespace Client Spec defines a standardized interface for catalog interactions such as table discovery, resolving table locations, and coordinating commits. It abstracts both the Directory Catalog (operating as an in-process library) and the REST Catalog (designed for client-server deployments) behind a single interface called LanceNamespace.

Namespace Overview

Why "Namespace" Instead of "Catalog"?

We use the term Namespace rather than Catalog because we want a generic term that fits into any hierarchical structure. Different systems use different names for their organizational units:

System Container Concepts
Apache Hive Metastore → Database → Table
Unity Catalog Metastore → Catalog → Schema → Table
Apache Polaris Catalog → Namespace (arbitrary levels) → Table
Directory Storage Root directory → Tables

The Lance Namespace Client provides a unified framework across all of these systems. A "namespace" in Lance can represent a catalog, schema, metastore, database, metalake, or any other hierarchical container — the spec abstracts away these differences.

This further enables integration with external catalog specifications such as the Apache Iceberg REST Catalog, Apache Hive Metastore, Unity Catalog, and Apache Polaris Catalog.

Examples

The following examples show how different catalog systems map to Lance Namespace.

Directory (1-level)

The simplest case: tables directly in a storage directory, a common use case for ML/AI scientists:

Directory Lance Namespace
/data/ Root Namespace
└─ users.lance Table ["users"]
└─ orders.lance Table ["orders"]

Unity Catalog (3-level)

Unity Catalog uses a 3-level hierarchy under a metastore (one metastore per server):

Unity Catalog Lance Namespace
Root Metastore Root Namespace
└─ Catalog "prod" Namespace ["prod"]
  └─ Schema "analytics" Namespace ["prod", "analytics"]
    └─ Table "users" Table ["prod", "analytics", "users"]

Apache Polaris (flexible levels)

Apache Polaris supports arbitrary namespace nesting:

Polaris Lance Namespace
Root Catalog Root Namespace
└─ Namespace "prod" Namespace ["prod"]
  └─ Namespace "team_a" Namespace ["prod", "team_a"]
    └─ Namespace "ml" Namespace ["prod", "team_a", "ml"]
      └─ Table "model" Table ["prod", "team_a", "ml", "model"]

Engine Interoperability

Because compute engines interact with catalogs through the Lance Namespace interface, they can work with Lance tables regardless of how the catalog is implemented or structured. Systems such as Apache DataFusion, Apache Spark, and Ray can interact with Lance tables through this interface, enabling distributed query execution, table maintenance, and multi-table workflows while remaining agnostic to the underlying catalog deployment.

For each programming language, a Lance Namespace Client provides a unified interface that compute engines can integrate against. For example:

  • Java SDK (org.lance:lance-namespace-core): Enables engines like Apache Spark, Apache Flink, Apache Kafka, Trino, Presto, etc. to build their Lance connectors.
  • Python SDK (lance_namespace): Enables frameworks like Ray, Dask, and MLflow to work with Lance tables.
  • Rust SDK (lance-namespace): The core interface used by native implementations.

Each catalog spec has corresponding implementations in supported languages that fulfill the Namespace Client interface/trait.

Namespace Java SDK Example