DuckLake Lead Developer: Treat Metadata as a Relational Database Problem, and Lakehouse Queries Become Just Catalogs and Parquet Files
Pedro Holanda, lead developer at DuckLabs, explains the core design choices of DuckLake 1.1: storing table metadata in a standard SQL database to replace manifest files scattered across object storage. The query path becomes: issue a query, and the server tells you which Parquet files to read; the data files remain unchanged, only the catalog changes.
Traditional lakehouse formats split metadata into numerous manifest files scattered across object storage. For every query, the engine must traverse these files to determine which Parquet data files to read. Pedro Holanda, lead developer at DuckLabs, argues that this is essentially a relational database problem that does not need to be solved using file system methods.
His explanation is straightforward: you issue a query, and the server answers with which Parquet files to read. The Parquet files themselves do not change; only the catalog changes. This is why DuckLake stores table metadata in a standard SQL database rather than scattering manifest files. Users are already familiar with SQL and schemas, so they do not need to learn an additional logic for traversing metadata.
DuckLake 1.1 was released in October alongside DuckDB 2.0.0 LTS, bringing file compaction and inline/flush mechanisms tailored for streaming data lakes. Regarding file compaction, when the number of files becomes excessive, DuckLake can merge multiple files into one to reduce request counts; this operation can span multiple snapshots, further compressing the total file volume. Regarding inlining, actual data representations are stored directly as tables within the catalog. Holanda stated that while building DuckLake, they realized that since they already had a database system and a catalog, why not store the data itself in tables?
This resolves the small-file problem in streaming scenarios. When multiple data sources write simultaneously, traditional lakehouses generate a large number of fragmented files. Queries then require traversing metadata and reading many small Parquet files, slowing down both processes. DuckLake absorbs these fragments into the catalog through inlining and flushing, deferring compaction operations until they are needed.