No description
  • Go 98.7%
  • Shell 0.6%
  • Python 0.5%
Find a file
Andrei Tserakhau c7839cad31
feat(table): equality delete read path in scanner (#818)
Collect equality delete entries during manifest scanning instead of
rejecting them. Match equality deletes to data files by partition and
sequence number (strictly greater, per spec). Apply hash-based anti-join
filter in the Arrow record processing pipeline.

Key encoding uses type-tagged, length-prefixed values to avoid
collisions. Delete files with different equality field IDs are applied
as independent filter groups.

Partitioned tables are not yet tested for the read path.
2026-03-29 14:05:21 -04:00
.github chore: add CODEOWNERS file (#814) 2026-03-27 10:40:26 -07:00
catalog feat(catalog): add CommitAndReload, error ctx, and 404 test for multi-tx (#817) 2026-03-28 14:23:50 -04:00
cmd/iceberg refactor: make partition spec and sort order fields range friendly (#772) 2026-03-05 16:12:22 -05:00
config feat(table): add ReplaceFiles method to transaction (#356) 2025-03-28 16:20:13 -04:00
dev feat: puffin Reader and Writer (#676) 2026-02-24 11:25:18 -05:00
internal feat(table): public write DataFile API (#776) 2026-03-19 12:17:38 -04:00
io refactor(io): use the registry pattern for IO schemes (#709) 2026-02-23 16:38:07 -05:00
puffin feat: puffin Reader and Writer (#676) 2026-02-24 11:25:18 -05:00
table feat(table): equality delete read path in scanner (#818) 2026-03-29 14:05:21 -04:00
utils ci(golangci-lint) :Add golangci linter (#315) 2025-03-04 18:04:05 -05:00
view fix(view): field ID preservation and error handling for RCK compatibility (#647) 2025-12-09 12:24:55 -05:00
website Add analytics for Iceberg-go (#653) 2025-12-10 23:23:29 -05:00
.asf.yaml infra: automatically delete head branches after merge (#634) 2025-11-30 15:19:18 -05:00
.gitattributes feat: schema and types (#1) 2023-08-16 07:48:37 +02:00
.gitignore feat: add support for azure blob with connection string/sas token/account key (#313) 2025-04-02 13:37:52 -04:00
.golangci.yml feat(ci): enable govet for lint (#706) 2026-01-28 16:32:55 -05:00
.pre-commit-config.yaml chore: clean up pre-commit (#705) 2026-01-28 15:30:27 -05:00
CONTRIBUTING.md docs: Introduce website with docs (#478) 2025-07-07 17:27:50 -04:00
errors.go fix(metadata): wrap errors with exported types (#597) 2025-10-09 13:53:03 -04:00
exprs.go feat(table): export StructLike and GetPartitionRecord (#791) 2026-03-17 13:18:27 -04:00
exprs_test.go ci(golangci-lint) :Add golangci linter (#315) 2025-03-04 18:04:05 -05:00
go.mod build(deps): bump the gomod_updates group with 6 updates (#822) 2026-03-29 13:56:12 -04:00
go.sum build(deps): bump the gomod_updates group with 6 updates (#822) 2026-03-29 13:56:12 -04:00
LICENSE ci: Quick update for release_rc.sh and the LICENSE (#201) 2024-11-13 07:44:45 +01:00
literals.go fix(literals): decimal literal marshalbinary (#745) 2026-02-19 21:11:42 -05:00
literals_test.go fix(literals): decimal literal marshalbinary (#745) 2026-02-19 21:11:42 -05:00
Makefile feat(rest): add support staged table creation in REST catalog (#754) 2026-02-26 11:27:45 -05:00
manifest.go feat(table): roll parquet files based on actual compressed size (#759) 2026-03-09 10:38:47 -04:00
manifest_test.go fix(manifest): handle lifecycle of the decoder in reader (#766) 2026-03-02 17:25:59 -05:00
name_mapping.go feat(metadata): verify timestamps in snapshot & metadata log (#578) 2025-09-26 14:53:44 -04:00
name_mapping_test.go feat(name_mapping): Add UpdateNameMapping function (#521) 2025-08-07 13:02:39 -04:00
NOTICE chore: Update copyright year in NOTICE file (#771) 2026-03-05 13:08:20 -08:00
operation_string.go feat(exprs): Adding BooleanExpressions and Predicates (#91) 2024-06-25 18:51:07 +02:00
partitions.go feat(table): export StructLike and GetPartitionRecord (#791) 2026-03-17 13:18:27 -04:00
partitions_bench_test.go perf(table): optimize partitioned write throughput (#622) 2025-11-17 13:42:47 -05:00
partitions_test.go feat(metadata): Add support for source-ids (#651) 2025-12-11 14:51:16 -05:00
predicates.go ci(golangci-lint) :Add golangci linter (#315) 2025-03-04 18:04:05 -05:00
README.md feat(hive): adding register table in hive catalog (#816) 2026-03-28 14:18:26 -04:00
schema.go fix: replace panics with proper error returns (#758) 2026-02-26 15:21:19 -05:00
schema_conversions.go feat(table): add fanout partition writer and rolling data writer (#524) 2025-09-23 16:00:03 -04:00
schema_conversions_test.go feat(table): add fanout partition writer and rolling data writer (#524) 2025-09-23 16:00:03 -04:00
schema_test.go fix: replace panics with proper error returns (#758) 2026-02-26 15:21:19 -05:00
transforms.go perf(table): optimize partitioned write throughput (#622) 2025-11-17 13:42:47 -05:00
transforms_test.go feat(types) add support for TimestampNano(Tz) (#594) 2025-10-24 16:06:59 -04:00
types.go fix: nil field Type causes unrecovered panic in MarshalJSON (#765) 2026-03-02 16:53:17 -05:00
types_test.go fix: nil field Type causes unrecovered panic in MarshalJSON (#765) 2026-03-02 16:53:17 -05:00
utils.go feat(table): export StructLike and GetPartitionRecord (#791) 2026-03-17 13:18:27 -04:00
visitors.go feat(table): export StructLike and GetPartitionRecord (#791) 2026-03-17 13:18:27 -04:00
visitors_test.go ci(golangci-lint) :Add golangci linter (#315) 2025-03-04 18:04:05 -05:00

Iceberg Golang

Go Reference

iceberg is a Golang implementation of the Iceberg table spec.

Build From Source

Prerequisites

  • Go 1.23 or later

Build

$ git clone https://github.com/apache/iceberg-go.git
$ cd iceberg-go/cmd/iceberg && go build .

Running Tests

Use the Makefile so commands stay in sync with CI (e.g. golangci-lint version).

Unit tests

make test

Linting

make lint

Install the linter first

make lint-install
# or: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v2.8.0

Integration tests

Prerequisites: Docker, Docker Compose

  1. Start the Docker containers using docker compose:

    make integration-setup
    
  2. Export the required environment variables:

    export AWS_S3_ENDPOINT=http://$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' minio):9000
    export AWS_REGION=us-east-1
    export SPARK_CONTAINER_ID=$(docker ps -qf 'name=spark-iceberg')
    export DOCKER_API_VER=$(docker version -f '{{.Server.APIVersion}}')
    
  3. Run the integration tests:

    make integration-test
    

    Or run a single suite: make integration-scanner, make integration-io, make integration-rest, make integration-spark.

Feature Support / Roadmap

FileSystem Support

Filesystem Type Supported
S3 X
Google Cloud Storage X
Azure Blob Storage X
Local Filesystem X

Metadata

Operation Supported
Get Schema X
Get Snapshots X
Get Sort Orders X
Get Partition Specs X
Get Manifests X
Create New Manifests X
Plan Scan x
Plan Scan for Snapshot x

Catalog Support

Operation REST Hive Glue SQL
Load Table X X X X
List Tables X X X X
Create Table X X X X
Register Table X X X
Update Current Snapshot X X X X
Create New Snapshot X X X X
Rename Table X X X X
Drop Table X X X X
Alter Table X X X X
Check Table Exists X X X X
Set Table Properties X X X X
List Namespaces X X X X
Create Namespace X X X X
Check Namespace Exists X X X X
Drop Namespace X X X X
Update Namespace Properties X X X X
Create View X X X
Load View X X
List View X X X
Drop View X X X
Check View Exists X X X

Read/Write Data Support

  • Data can currently be read as an Arrow Table or as a stream of Arrow record batches.

Supported Write Operations

As long as the FileSystem is supported and the Catalog supports altering the table, the following tracks the current write support:

Operation Supported
Append Stream X
Append Data Files X
Rewrite Files
Rewrite manifests
Overwrite Files X
Copy-On-Write Delete X
Write Pos Delete X
Write Eq Delete
Row Delta

CLI Usage

Run go build ./cmd/iceberg from the root of this repository to build the CLI executable, alternately you can run go install github.com/apache/iceberg-go/cmd/iceberg@latest to install it to the bin directory of your GOPATH.

The iceberg CLI usage is very similar to pyiceberg CLI
You can pass the catalog URI with --uri argument.

Example: You can start the Iceberg REST API docker image which runs on default in port 8181

docker pull apache/iceberg-rest-fixture:latest
docker run -p 8181:8181 apache/iceberg-rest-fixture:latest

and run the iceberg CLI pointing to the REST API server.

 ./iceberg --uri http://0.0.0.0:8181 list
┌─────┐
| IDs |
| --- |
└─────┘

Create Namespace

./iceberg --uri http://0.0.0.0:8181 create namespace taxitrips

List Namespace

 ./iceberg --uri http://0.0.0.0:8181 list
┌───────────┐
| IDs       |
| --------- |
| taxitrips |
└───────────┘


Get in Touch