Apache Iceberg Go 0.6.0 Release
The Apache Iceberg community is pleased to announce version 0.6.0 of iceberg-go.
This release covers approximately three months of development since the 0.5.0 release in March 2026 and is the result of merging nearly 200 PRs from 40 contributors, including 26 first-time contributors. See the full changelog for the complete list of changes.
iceberg-go is a native Go implementation of the Apache Iceberg table format, providing libraries for reading, writing, and managing Iceberg tables in Go applications.
Release Highlights🔗
Iceberg V3 Table Spec Support🔗
This release continues to advance iceberg-go's implementation of the Iceberg V3 table specification:
- Variant type: Support for the V3
varianttype (non-shredding) was added - Deletion vectors: A deletion vector reader and
SerializeDV/DVWriterauthoring APIs, with blob header validation on read, cardinality validation throughReadDV, and required blob properties enforced on write - Row lineage: Row lineage support in V3, with reserved row-lineage fields projected as null when a file lacks them
- Nanosecond timestamps: Parquet support for the nanosecond timestamp types and mapping of nanosecond Arrow timestamps to the V3
TimestampNs/TimestampTzNstypes - Defaults:
write-defaultandinitial-defaultimplemented for V3 and enforced for required fields - Format-version gating: V3-only metadata fields are gated on sub-V3 reads, V2-only fields are gated on V1 reads, and the remaining V3 metadata-upgrade validation rules were ported
- Format-version upgrade: A
Transaction.UpgradeFormatVersionAPI was added
Row-Level Deletes🔗
iceberg-go gained a full equality-delete path and an atomic row-level mutation API:
- Equality deletes: Write path, read path in the scanner, and support for partitioned tables
- RowDelta API: An atomic row-level mutation API was added
- Overwrite with deletes: Delete file removal in overwrite commits and deletion vectors classified in scan planning
Table Maintenance and Compaction🔗
A new compaction and maintenance suite landed in this release:
- Compaction execution:
RewriteDataFilesfor compaction with a bin-pack strategy andAnalyzefor dry-run planning - Dangling deletes: Dangling equality deletes are dropped during
RewriteDataFiles - RewriteFiles op: A
RewriteFilessnapshot-op builder was added
Concurrency and Conflict Resolution🔗
Optimistic concurrency control was substantially hardened:
- Conflict validation framework: A conflict validation framework was added and wired into producers
- Commit retries:
doCommitretries on commit-conflict errors, with refresh-and-replay between retries and concurrent-write conflicts wrapped withErrCommitFailed - RowDelta conflicts:
RowDeltauses a partition-scoped conflict check instead of always-true
Hadoop Catalog🔗
A Hadoop catalog implementation was added over the course of the release:
- Scaffold and path helpers: Initial Hadoop catalog scaffold
- Namespace and table operations: Namespace operations, list/drop/rename, and table and namespace CRUD
- CLI integration: Hadoop catalog CLI integration
Catalog Improvements🔗
- Multi-table commits: A
TransactionalCataloginterface and REST multi-table commit, plusCommitAndReload - OAuth and credentials: OAuth token refresh, vended credential refresh, audience and resource OAuth params, and a
WithOAuthTLSConfigoption for separate OAuth-server TLS - Hive catalog: Register table and create view support
- REST views:
RegisterViewwas added to the REST catalog
Expanded CLI🔗
The command-line tool gained a large set of new commands:
- Maintenance commands:
expire-snapshots,clean-orphan-files,partition-stats, andcompact analyze/compact run - Table operations:
branch create/tag create,upgrade/rollback,snapshots/refs, and aninfosummary command - Schema flags:
--schema-from-fileto infer a schema from Parquet files and a--show-defaultsflag - Argument parsing: The CLI migrated from docopt-go to go-arg
Write Performance and Bloom Filters🔗
- File sizing: Parquet files are rolled based on actual compressed size
- Partitioned writes: A clustered partitioned write path was added
- Memory pressure: Reduced memory pressure by releasing records and an optional skip of the duplicate check on
AddDataFiles - Bloom filters: Bloom filter scan pruning for Parquet row groups and bloom filter properties wired into the Parquet writer
- Metadata compression: Support for the zstd metadata compression codec
IO Improvements🔗
- In-memory FS: A native in-memory filesystem was added
- Aliyun OSS: The
ossscheme is registered for Aliyun OSS S3-compatible storage - New interfaces: A
ListableIOinterface replaces reflect-based directory walking, and aBulkRemovableIOinterface was added - S3 Table Buckets:
PermanentRedirectis resolved for S3 Table Buckets
Statistics🔗
- Statistics updates:
SetStatistics,RemoveStatistics,AddEncryptionKey, andRemoveEncryptionKeyupdates were implemented - Partition statistics:
SetPartitionStatisticsUpdateandRemovePartitionStatisticsUpdatewere added
Bug Fixes🔗
Notable bug fixes in this release include:
- Fix a nil field
Typepanic inMarshalJSON - Use floored division in
HourTransformfor pre-epoch timestamps - Handle
LargeStringcolumns in partition transforms - Fast-append must inherit all parent manifests unconditionally
- Fix a goroutine leak in
positionDeleteRecordsToDataFiles - Fix a deadlock in
MapExecwhen workers error - Fix a refcount leak in
enrichRecordsWithPosDeleteFields - Reject duplicate field IDs at schema construction
- Change equality_ids Avro element type from Long to Integer to match the spec
- Decode pre-1.4 Java Iceberg legacy manifest list field names
- Resolve a data race in
MarshalJSONon a shared*Schema - Emit a proper Avro fixed schema for
FixedTypepartition columns
Breaking Changes🔗
Some of these changes are breaking changes that need to be called out:
- Manifest entries iterator (#985):
FetchEntrieswas replaced with an iterator-based approach. - Multi-arg transforms (#824): partition and sort fields now support multi-argument transforms, changing the relevant field signatures.
New Contributors🔗
Welcome to all 26 first-time contributors: @starpact, @PranjalChaitanya, @rockwotj, @RSP22, @Hashcode-Ankit, @hcrosse, @Herrtian, @gabrnavarro, @Narwhal-fish, @alliasgher, @abhirathod95, @rohilsurana, @twmb, @cassio-paesleme, @Jeffail, @benbellick, @varun0630, @hectar-glitches, @swjtu-zhanglei, @jacobmarble, @C-Loftus, @nssalian, @tanmayrauth, @fallintoplace, @happydave1, @mzzz-zzm
Getting Involved🔗
The iceberg-go project welcomes contributions. We use GitHub issues for tracking work and the Apache Iceberg Community Slack for discussions.
The easiest way to get started is to:
- Try
iceberg-gowith your workloads and report any issues you encounter - Review the contributor guide
- Look for good first issues
For more information, visit the iceberg-go repository.