Zum Inhalt springen

Lance-Erweiterung

Die lance-Erweiterung fügt Unterstützung für das Lesen und Schreiben von Lance-Tabellen hinzu. Lance ist ein modernes Lakehouse-Format, das für ML/AI-Workloads optimiert ist und native Cloud-Storage-Unterstützung bietet.

Installation und Laden

Sie können die lance-Erweiterung aus dem Kern-Erweiterungs-Repository von DuckDB installieren und mit den folgenden Befehlen laden:

INSTALL lance;
LOAD lance;

Verwendung

Ein Lance-Dataset abfragen

Lokale Datei:

SELECT *
FROM '⟨path/to/dataset.lance⟩'
LIMIT 10;

S3:

SELECT *
FROM 's3://⟨bucket/path/to/out.lance⟩'
LIMIT 10;

Um Object-Store-URIs (z. B. s3://...) zu verwenden, konfigurieren Sie ein Secret vom Typ TYPE lance über den Secrets Manager:

CREATE SECRET (
TYPE lance,
PROVIDER credential_chain,
SCOPE 's3://bucket/'
);
SELECT *
FROM 's3://⟨bucket/path/to/out.lance⟩'
LIMIT 10;

Ein Lance-Dataset schreiben

Verwenden Sie die Anweisung COPY ... TO ..., um Abfrageergebnisse als Lance-Dataset zu materialisieren.

-- Create/overwrite a Lance dataset from a query
COPY (
SELECT 1::BIGINT AS id, 'a'::VARCHAR AS s
UNION ALL
SELECT 2::BIGINT AS id, 'b'::VARCHAR AS s
) TO '⟨path/to/dataset.lance⟩' (
FORMAT lance,
MODE 'overwrite'
);
-- Read it back via the replacement scan
SELECT count(*) FROM '⟨path/to/dataset.lance⟩';
-- Append more rows to an existing dataset
COPY (
SELECT 3::BIGINT AS id, 'c'::VARCHAR AS s
) TO '⟨path/to/dataset.lance⟩' (
FORMAT lance,
MODE 'append'
);
-- Optionally create an empty dataset (schema only)
COPY (
SELECT 1::BIGINT AS id, 'x'::VARCHAR AS s
WITH NO DATA
) TO 'path/to/empty.lance' (
FORMAT lance,
MODE 'overwrite',
WRITE_EMPTY_FILE true
);

Um auf s3://...-Pfade zu schreiben, konfigurieren Sie ein Secret vom Typ TYPE lance für diesen Scope über den Secrets Manager:

CREATE SECRET (
TYPE lance,
PROVIDER credential_chain,
SCOPE 's3://⟨bucket⟩/'
);
COPY (SELECT 1 AS id)
TO 's3://⟨bucket/path/to/out.lance⟩'
(FORMAT lance, MODE 'overwrite');

Ein Lance-Dataset mit CREATE TABLE erstellen (Directory Namespace)

Wenn Sie ein Verzeichnis als Lance-Namespace ATTACHen, können Sie neue Datasets mit CREATE TABLE (nur Schema) oder CREATE TABLE AS SELECT (CTAS) erstellen. Das Dataset wird nach ⟨namespace_root⟩/⟨table_name.lance⟩{:.language-sql .highlight} geschrieben.

ATTACH '⟨path/to/dir⟩' AS lance_ns (TYPE lance);
-- Schema-only (creates an empty dataset)
CREATE TABLE lance_ns.main.my_empty (id BIGINT, s VARCHAR);
-- CTAS (writes query results)
CREATE TABLE lance_ns.main.my_dataset AS
SELECT 1::BIGINT AS id, 'a'::VARCHAR AS s
UNION ALL
SELECT 2::BIGINT AS id, 'b'::VARCHAR AS s;
SELECT count(*) FROM lance_ns.main.my_dataset;

Vektorsuche

-- Search a vector column, returning distances in `_distance` (smaller is closer)
SELECT id, label, _distance
FROM lance_vector_search(
'⟨path/to/dataset.lance⟩', 'vec',
[0.1, 0.2, 0.3, 0.4]::FLOAT[4],
k = 5,
prefilter = true
)
ORDER BY _distance ASC;

Siehe die SQL-Referenz für die vollständige Parameterdokumentation.

Volltextsuche (FTS)

-- Search a text column, returning BM25-like scores in `_score`
SELECT id, text, _score
FROM lance_fts(
'⟨path/to/dataset.lance⟩',
'text',
'puppy',
k = 10,
prefilter = true
)
ORDER BY _score DESC;

Siehe die SQL-Referenz für die vollständige Parameterdokumentation.

Hybride Suche (Vektor + FTS)

-- Combine vector and text scores, returning `_hybrid_score` in addition to `_distance` / `_score`
SELECT id, _hybrid_score, _distance, _score
FROM lance_hybrid_search('⟨path/to/dataset.lance⟩',
'vec', [0.1, 0.2, 0.3, 0.4]::FLOAT[4],
'text', 'puppy',
k = 10, prefilter = false,
alpha = 0.5, oversample_factor = 4)
ORDER BY _hybrid_score DESC;

Einschränkungen

Die lance-Erweiterung ist derzeit für die folgenden Plattformen verfügbar:

  • linux_amd64
  • linux_arm64
  • osx_arm64
  • windows_amd64