Stream any DuckDB query into Lance datasets with Blob v2 storage and scalar, vector, text, and Bloom filter indexes
Compatibility Matrix
This table covers all DuckDB releases that have not reached end-of-life, including LTS releases, and shows the 2 most recent patch releases of each. Older patch releases are not listed, but the extension may be available for them as well.
| Platform | 1.4.4 | 1.4.5 | 1.5.5 | 1.5.6 | 2.0.0 |
|---|---|---|---|---|---|
| Linux AMD64 | |||||
| Linux ARM64 | |||||
| macOS AMD64 | |||||
| macOS ARM64 | |||||
| Windows AMD64 | |||||
| Windows ARM64 | |||||
| WebAssembly |
Installing and Loading
INSTALL lance_conversion FROM community;
LOAD lance_conversion;
Example
INSTALL lance_conversion FROM community;
LOAD lance_conversion;
COPY (
SELECT *
FROM read_parquet('events/**/*.parquet')
) TO 'events.lance' (FORMAT LANCE);
About lance_conversion
lance_conversion registers Lance as a native DuckDB COPY destination.
DuckDB reads, filters, joins, casts, and projects the source query, then
streams its output into the Rust Lance writer without an intermediate
Parquet export or full-input materialization.
Any source that DuckDB can query can be written to Lance, including DuckDB tables and views, Parquet, CSV, JSON, and S3-backed data:
COPY events TO 'events.lance' (FORMAT LANCE);
COPY (
SELECT *
FROM read_json_auto('events.json')
) TO 'events_from_json.lance' (FORMAT LANCE);
The extension also provides read_huggingface for Hugging Face Parquet
datasets and read_warc for local or S3 WARC/WARC.GZ files:
COPY (
SELECT * FROM read_huggingface('lhoestq/demo1')
) TO 'demo1.lance' (FORMAT LANCE);
COPY (
SELECT id, type, date, content_type, body
FROM read_warc('archive.warc.gz')
) TO 'archive.lance' (FORMAT LANCE);
read_huggingface fetches only the projected Parquet columns and decodes
row groups in the background. max_read_parallelism bounds concurrent
row-group reads, and read_ahead_bytes caps the decoded data each one may
queue (0 disables read-ahead):
SELECT id, package_name
FROM read_huggingface(
'lhoestq/demo1',
max_read_parallelism = 8,
read_ahead_bytes = 67108864
);
Storage timeouts and retries for S3 and Hugging Face I/O are configured
through the lance_conversion_storage_* settings:
SET lance_conversion_storage_io_timeout_ms = 30000;
SET lance_conversion_storage_retry_max_times = 5;
Lance writes support Create (the default), Append, and Overwrite modes:
COPY new_events TO 'events.lance' (FORMAT LANCE, APPEND);
COPY replacement TO 'events.lance' (FORMAT LANCE, OVERWRITE);
When row order need not be preserved, every DuckDB thread runs its own
Lance writer, and all writers commit as one dataset version. Use
PRESERVE_ORDER false for the fastest writes:
COPY events TO 'events.lance' (FORMAT LANCE, PRESERVE_ORDER false);
SAMPLE_PERCENT and SAMPLE_ROWS write a random sample of the source
rows instead of every row:
COPY events TO 'events_10pct.lance' (FORMAT LANCE, SAMPLE_PERCENT 10);
COPY events TO 'events_sample.lance' (FORMAT LANCE, SAMPLE_ROWS 1000);
Blob v2 layout, data file sizing, and indexes are configurable directly
from the COPY statement:
COPY (
SELECT id, event_id, category, description, embedding, asset_uri
FROM read_parquet('catalog/**/*.parquet')
) TO 'catalog.lance' (
FORMAT LANCE,
TARGET_FILE_SIZE 536870912,
BLOB_INLINE_SIZE_THRESHOLD 2097152,
BLOB_DEDICATED_SIZE_THRESHOLD 16777216,
BLOB_COLUMNS (asset_uri),
SCALAR_INDEX_COLUMNS (id, category),
VECTOR_INDEX_COLUMNS (embedding),
TEXT_INDEX_COLUMNS (description),
BLOOM_FILTER_INDEX_COLUMNS (event_id)
);
Local and S3-compatible Lance destinations are supported. S3 credentials, endpoint, region, TLS, and URL style are resolved from DuckDB secrets and passed to the OpenDAL-backed Lance object store.
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| read_atif | table | Reads ATIF agent trajectories from a local or S3 JSON or JSONL file. | NULL | [SELECT * FROM read_atif('trajectories.jsonl');] |
| read_huggingface | table | Reads a Hugging Face dataset's Parquet files. | NULL | [SELECT * FROM read_huggingface('lhoestq/demo1');] |
| read_warc | table | Reads records from a local or S3 WARC file. | NULL | [SELECT * FROM read_warc('archive.warc.gz');] |
Overloaded Functions
This extension does not add any function overloads.
Added Types
This extension does not add any types.
Added Settings
| name | description | input_type | scope | aliases |
|---|---|---|---|---|
| lance_conversion_storage_io_timeout_ms | IO operation and body method timeout per attempt (ms) | BIGINT | GLOBAL | [] |
| lance_conversion_storage_retry_factor | Storage exponential retry backoff multiplier for reads and writes | DOUBLE | GLOBAL | [] |
| lance_conversion_storage_retry_max_delay_ms | Maximum exponential retry backoff (ms) | BIGINT | GLOBAL | [] |
| lance_conversion_storage_retry_max_times | Maximum retries after the initial attempt (0 disables retries) | BIGINT | GLOBAL | [] |
| lance_conversion_storage_retry_min_delay_ms | Initial exponential retry backoff (ms) | BIGINT | GLOBAL | [] |
| lance_conversion_storage_timeout_ms | Control operation timeout per attempt (ms) | BIGINT | GLOBAL | [] |