Skip to content

Commit bb94ac7

Browse files
committed
chore: public-readiness polish
- Fix lowercase 'andreabozzo' in package metadata and CONTRIBUTING clone URL so .nupkg PackageProjectUrl/RepositoryUrl match the canonical github.com/AndreaBozzo casing. - Add "Why IcebergSharp" positioning paragraph and tighten scope / non-goals bullets in README. Add Iceberg-spec and Integration badges. - Pin apache/polaris to 1.4.1 (was :latest), bump MinIO and mc to the releases used by the upstream apache/polaris minio guide, and switch to quay.io/minio for parity.
1 parent 2172732 commit bb94ac7

5 files changed

Lines changed: 47 additions & 39 deletions

File tree

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ issues with concrete reproductions.
2020
## Development setup
2121

2222
```bash
23-
git clone https://github.com/andreabozzo/IcebergSharp.git
23+
git clone https://github.com/AndreaBozzo/IcebergSharp.git
2424
cd IcebergSharp
2525
dotnet restore
2626
dotnet build

Directory.Build.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
<Company>IcebergSharp</Company>
4545
<Product>IcebergSharp</Product>
4646
<Copyright>Copyright (c) 2026 Andrea Bozzo and IcebergSharp contributors</Copyright>
47-
<PackageProjectUrl>https://github.com/andreabozzo/IcebergSharp</PackageProjectUrl>
48-
<RepositoryUrl>https://github.com/andreabozzo/IcebergSharp</RepositoryUrl>
47+
<PackageProjectUrl>https://github.com/AndreaBozzo/IcebergSharp</PackageProjectUrl>
48+
<RepositoryUrl>https://github.com/AndreaBozzo/IcebergSharp</RepositoryUrl>
4949
<RepositoryType>git</RepositoryType>
5050
<PackageLicenseExpression>MIT OR Apache-2.0</PackageLicenseExpression>
5151
<PackageReadmeFile>README.md</PackageReadmeFile>

README.md

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,60 @@
22

33
> A vendor-neutral .NET reader for [Apache Iceberg](https://iceberg.apache.org) tables.
44
5-
[![CI](https://github.com/andreabozzo/IcebergSharp/actions/workflows/ci.yml/badge.svg)](https://github.com/andreabozzo/IcebergSharp/actions/workflows/ci.yml)
5+
[![CI](https://github.com/AndreaBozzo/IcebergSharp/actions/workflows/ci.yml/badge.svg)](https://github.com/AndreaBozzo/IcebergSharp/actions/workflows/ci.yml)
6+
[![Integration](https://github.com/AndreaBozzo/IcebergSharp/actions/workflows/integration.yml/badge.svg)](https://github.com/AndreaBozzo/IcebergSharp/actions/workflows/integration.yml)
67
[![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue)](#license)
78
[![.NET](https://img.shields.io/badge/.NET-9.0%20%7C%208.0-512BD4)](#requirements)
9+
[![Iceberg spec](https://img.shields.io/badge/Iceberg-v2%20%7C%20v3-orange)](https://iceberg.apache.org/spec/)
810

9-
IcebergSharp lets .NET applications read Apache Iceberg tables directly from a REST
10-
catalog (Apache Polaris, Project Nessie, Snowflake Open Catalog, AWS Glue, lakekeeper,
11-
Unity Catalog) without going through Spark, Trino, or any JVM service.
11+
IcebergSharp lets .NET applications read [Apache Iceberg](https://iceberg.apache.org)
12+
tables directly from a REST catalog (Apache Polaris, Project Nessie, Snowflake Open
13+
Catalog, AWS Glue, lakekeeper, Unity Catalog) without going through Spark, Trino, or
14+
any JVM service.
1215

13-
The library handles the things that make Iceberg interesting and hard to get right:
16+
It handles the things that make Iceberg interesting and hard to get right:
1417
field-id resolution for schema evolution, partition pruning at the manifest level,
1518
column-stats pruning at the data-file level, and time travel via snapshots.
1619

20+
### My idea behind IcebergSharp
21+
22+
Today, .NET teams that want to read Iceberg either spin up a JVM service (Spark
23+
Connect, Trino) and pay the latency / ops cost, or go through a query engine that
24+
doesn't expose Iceberg's metadata to them. There's no native client that gives a
25+
.NET app the same first-class access that `pyiceberg` gives Python or
26+
`iceberg-rust` gives Rust. IcebergSharp aims to be that client: read-only, no JVM,
27+
no embedded query engine — just metadata and Arrow batches you can hand to
28+
DuckDB.NET, ML.NET, or Power BI.
29+
1730
> **Status:** Phase 0 — repository scaffolding only. No public API yet. See the
1831
> [roadmap](#roadmap) for what is coming and when.
1932
2033
---
2134

2235
## Scope (what this library does and does NOT do)
2336

24-
**In scope for v1:**
37+
**In scope for v1** — read-only Iceberg, focused on what analytical workloads actually
38+
need:
2539

26-
- Read-only access to Iceberg tables.
27-
- REST Catalog client (spec-compliant, with dynamic endpoint discovery).
28-
- AWS Glue Iceberg REST endpoint (SigV4 auth).
29-
- Local, S3, and Azure Data Lake Storage Gen2 file IO.
40+
- Spec-compliant REST Catalog client with dynamic endpoint discovery; AWS Glue SigV4.
41+
- File IO for local, S3, and ADLS Gen2.
3042
- Parquet data files with field-id resolution.
3143
- Partition pruning, column-stats pruning, projection pushdown.
32-
- Time travel: scan any historical snapshot by id or timestamp.
33-
- Schema evolution: add column, drop column, rename column, type promotion.
34-
- Apache Arrow output adapter for zero-copy interop with DuckDB.NET / Polars.NET / ML.NET.
35-
36-
**Out of scope for v1 (explicit non-goals):**
37-
38-
-**No write path.** No `CREATE TABLE`, no `INSERT`, no commits, no snapshot creation,
39-
no manifest writing. Writing Iceberg correctly is ~70% of the engineering effort and
40-
~90% of the bugs in existing implementations. The goal of v1 is "read-only, done well."
41-
-**No merge-on-read / delete files.** v1 reads copy-on-write tables only. Position
42-
and equality delete files are skipped with a clear warning. Most analytical workloads
43-
on Iceberg are still COW-dominant.
44-
-**No Hive Metastore.** REST catalogs only. If you are on HMS, point an Iceberg REST
45-
adapter at it and use IcebergSharp against the adapter.
46-
-**No bundled SQL engine.** IcebergSharp exposes `IAsyncEnumerable<RecordBatch>` and
47-
Arrow streams; bring your own query layer (DuckDB.NET, Microsoft.Data.Analysis, etc.).
48-
49-
These boundaries are load-bearing. Re-discussing them risks turning the project into a
50-
half-finished Iceberg engine instead of a focused, reliable reader.
44+
- Time travel by snapshot id or timestamp.
45+
- Schema evolution: add / drop / rename column, type promotion.
46+
- Apache Arrow output for zero-copy interop with DuckDB.NET / Polars.NET / ML.NET.
47+
48+
**Out of scope for v1** (load-bearing boundaries — re-discussing them risks turning
49+
the project into a half-finished engine instead of a focused reader):
50+
51+
-**No write path.** No `CREATE TABLE`, `INSERT`, commits, or manifest writing.
52+
Writing Iceberg correctly is ~70% of the engineering effort and ~90% of the bugs
53+
in existing implementations. v1 is "read-only, done well."
54+
-**No merge-on-read / delete files.** COW tables only; delete files are skipped
55+
with a warning. Most analytical Iceberg workloads remain COW-dominant.
56+
-**No Hive Metastore.** REST catalogs only — point an Iceberg REST adapter at HMS.
57+
-**No bundled SQL engine.** You get `IAsyncEnumerable<RecordBatch>` and Arrow
58+
streams; bring your own query layer.
5159

5260
---
5361

@@ -161,8 +169,8 @@ Catalog
161169
└─ DataFile[] (Parquet w/ field-id annotations)
162170
```
163171

164-
The reader's job is: given `catalog.LoadTable(...)`, walk this tree, apply partition +
165-
stats pruning, and stream rows from Parquet with correct field-id resolution.
172+
Given `catalog.LoadTable(...)`, the reader walks this tree, prunes by partition and
173+
column stats, and streams Parquet rows with field-id resolution.
166174

167175
---
168176

tests/IcebergSharp.Integration/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ docker compose down -v
1818
warehouse pointing at `s3://warehouse/`.
1919
- Bootstrap credentials: realm `default-realm`, principal `root`, secret `s3cr3t`.
2020
- MinIO credentials: `minioadmin` / `minioadmin`.
21-
- The Polaris image tag is intentionally `:latest` for now; pin to a specific
22-
release once we lock the compatibility matrix for v1.
21+
- The Polaris image is pinned to `apache/polaris:1.4.1`. Bump deliberately when
22+
testing newer releases; do not float to `:latest`.

tests/IcebergSharp.Integration/docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ name: icebergsharp-it
1212

1313
services:
1414
minio:
15-
image: minio/minio:RELEASE.2025-01-20T14-49-07Z
15+
image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
1616
command: server /data --console-address ":9001"
1717
environment:
1818
MINIO_ROOT_USER: minioadmin
@@ -27,7 +27,7 @@ services:
2727
retries: 10
2828

2929
minio-bootstrap:
30-
image: minio/mc:RELEASE.2025-01-17T23-25-50Z
30+
image: quay.io/minio/mc:RELEASE.2025-08-13T08-35-41Z
3131
depends_on:
3232
minio:
3333
condition: service_healthy
@@ -40,7 +40,7 @@ services:
4040
"
4141
4242
polaris:
43-
image: apache/polaris:latest
43+
image: apache/polaris:1.4.1
4444
depends_on:
4545
minio-bootstrap:
4646
condition: service_completed_successfully

0 commit comments

Comments
 (0)