cd /news/developer-tools/hardwood-modern-lightweight-java-rea… · home › topics › developer-tools › article
[ARTICLE · art-156558] src=hardwood.dev ↗ pub= topic=developer-tools verified=true sentiment=↑ positive

Hardwood - modern lightweight Java reader and writer for Parquet file format

Gunnar Morling released Hardwood 1.1.0.Beta2 on 2026-10-12, adding row group control in the writer, faster S3 reads and footer caching to the lightweight Java library and command-line tool for reading and writing Apache Parquet files. Hardwood, which reached 1.0 on 2026-06-25, has zero transitive dependencies beyond optional compression libraries (Snappy, ZSTD, LZ4, Brotli) and aims to be the fastest Parquet reader and writer for the JVM without pulling in Hadoop, Avro or the parquet-java dependency tree. The 1.1.0.Beta1 release on 2026-08-31 added Parquet write support and Bloom filter pruning, and the project ships a drop-in shim module for migration from parquet-java plus a CLI skill that lets agents inspect and analyse Parquet files.

read4 min views2 publishedOct 24, 2026

A modern lightweight Java reader and writer for the Apache Parquet file format. Available as a Java library and a command-line tool.

What's new

Why Hardwood #

Hardwood gives applications fast and efficient support for reading and writing Parquet, without pulling in Hadoop, Avro, or the wider parquet-java dependency tree. It is built to be:

  • Light-weight : Zero transitive dependencies beyond optional compression libraries (Snappy, ZSTD, LZ4, Brotli)
  • Fast : Hardwood aims to be the fastest Parquet reader and writer for the JVM (1.0 read benchmarks )
  • Complete : Read and write support for flat and nested schemas, every logical type, every primitive type in current use, and the encodings and codecs in current use, with new format additions tracked as they land
  • Scalable : Hardwood is multi-threaded at the core, pages are decoded in parallel, with cross-file prefetching for multi-file reads
  • Embeddable : The Hardwood library can be used in GraalVM native binaries; a WASM build ofdive runs in the browser as apreview
  • Agent-friendly : Hardwood's CLI comes with a skill which lets your agents inspect and analyse Parquet files
  • Compatible : Adrop-in shim module facilitates migration fromparquet-java , with documented divergences where Hardwood applies stricter semantics (e.g. SQL three-valuednotEq )

The CLI inspects and analyses Parquet files and includes an interactive TUI for exploring a file's schema, row groups, pages, and data.

Quick Example #

Reading a file with the row-based API:

import dev.hardwood.InputFile;
import dev.hardwood.reader.ParquetFileReader;
import dev.hardwood.reader.RowReader;

try (ParquetFileReader fileReader = ParquetFileReader.open(InputFile.of(path));
    RowReader rowReader = fileReader.rowReader()) {

    while (rowReader.hasNext()) {
        rowReader.next();

        long id = rowReader.getLong("id");
        String name = rowReader.getString("name");
        LocalDate birthDate = rowReader.getDate("birth_date");
        Instant createdAt = rowReader.getTimestamp("created_at");
    }
}

Writing a file row by row:

import dev.hardwood.OutputFile;
import dev.hardwood.writer.ParquetFileWriter;
import dev.hardwood.writer.RowWriter;

try (ParquetFileWriter writer = ParquetFileWriter.create(OutputFile.of(path), schema)) {
    RowWriter rows = writer.rowWriter();

    for (Person person : people) {
        rows.writeRow(row -> row
                .setLong("id", person.id())
                .setString("name", person.name())
                .setDate("birth_date", person.birthDate()));
    }
}

Set up Hardwood in your project, then read your first file end-to-end. Alternatively, install the Hardwood CLI for working with Parquet files on the command line.

Status and Limitations #

The read path is stable and suitable for production use; ColumnReader, with its Validity and LayerKind types, is annotated @Experimental, so its shape may still change. The write path ships both APIs described under Choosing a Writer; the row-oriented RowWriter and its builders, the ColumnBatch setters for nested and nullable columns, and the in-memory destination InMemoryOutputFile are annotated @Experimental, so their shape may still change.

Writing targets local files through OutputFile.of(Path) and the heap through OutputFile.inMemory(). Reads have no file-size ceiling, but a column chunk read without an OffsetIndex is capped at 2 GB, and some backends carry their own limits; see Limits.

Roadmap #

Forward-looking items, none committed to a specific release.

  • Finalize ColumnReader API — stabilize the API for columnar access and move it out of "Experimental" state. (#522 )
  • Writer extensions — object-store output and parallel column encoding, on top of the write path described inThe Write Model . (#9 )
  • Parquet Modular Encryption — read files encrypted under the ParquetModular Encryption spec : encrypted footer, per-column keys, AES-GCM and AES-GCM-CTR. (#128 )
  • Apache Arrow interop —ColumnReader output as ArrowFieldVector /VectorSchemaRoot for zero-copy handoff to DuckDB, DataFusion, Pandas-via-JNI, and other Arrow-native consumers. (#153 )

Getting help #

Ask questions on GitHub Discussions and file bugs on the issue tracker; see Contributing.

Articles, talks & podcasts #

── more in #developer-tools 4 stories · sorted by recency
── more on @hardwood 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/hardwood-modern-ligh…] indexed:0 read:4min 2026-10-24 · —