Because the metadata stores the smallest and largest value of each column in each file, a reader can skip files that cannot match a filter, without opening them. This is called data skipping. In our lab, a query for trips on 14 February 2025 (158,575 of the 11,198,026) was narrowed to one data file in each format before any rows were read.
The cost shows up when a pipeline commits often with little data each time. We wrote January again as 120 small commits of about 28,960 rows each. Delta ended with 120 data files and 122 metadata files, including one automatic checkpoint at the 100th commit. Iceberg ended with 120 data files and 361 metadata files, because each commit wrote a new metadata.json, manifest list and manifest. Hudi grew its existing file instead of adding new ones, so its newest version read just 1 data file, but it wrote 412 metadata files and rewrote a growing file on every commit.
That is the small files problem, and the answer is maintenance: compaction (rewriting many small files into a few large ones) and cleaning up old snapshots. Cleanup has a price: once old files are removed, time travel to those versions is gone.