This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new 2f816c544 deploy: b1206c60aeabb6a9a31f72daccf98305dcf5d759
2f816c544 is described below
commit 2f816c5447633a0a5c87d729dd6cfa650f413ff5
Author: zeroshade <[email protected]>
AuthorDate: Mon Nov 9 18:26:10 2026 +0000
deploy: b1206c60aeabb6a9a31f72daccf98305dcf5d759
---
api.html | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
print.html | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
searchindex.js | 2 +-
searchindex.json | 2 +-
4 files changed, 114 insertions(+), 4 deletions(-)
diff --git a/api.html b/api.html
index e0aeb528a..5b7f3adea 100644
--- a/api.html
+++ b/api.html
@@ -490,6 +490,35 @@ newTbl, err = tbl.Overwrite(ctx, recordReader, nil,
)
</code></pre>
<p><code>OverwriteTable</code> is the <code>arrow.Table</code> variant.</p>
+<h3 id="dynamic-partition-overwrite"><a class="header"
href="#dynamic-partition-overwrite">Dynamic partition overwrite</a></h3>
+<p>Replace only the partitions present in the incoming data. Unlike a filtered
+row-level overwrite, this removes <strong>all existing data files</strong> in
those partitions
+while retaining files in other partitions.</p>
+<pre><code class="language-go">// Write Arrow record batches, replacing only
partitions receiving new rows.
+newTbl, err := tbl.DynamicPartitionOverwrite(ctx, recordReader, nil)
+
+// In-memory Arrow tables work too.
+newTbl, err = tbl.DynamicPartitionOverwriteTable(ctx, arrowTbl, 1024, nil)
+
+// Or commit already-written Iceberg DataFile metadata through a transaction.
+txn := tbl.NewTransaction()
+err = txn.DynamicPartitionOverwriteDataFiles(ctx, newDataFiles, nil)
+if err == nil {
+ newTbl, err = txn.Commit(ctx)
+}
+</code></pre>
+<p>This supports Iceberg format v1-v3. Incoming files must use the current
+partition spec. On partitioned tables, files under older specs are preserved;
+only matching current-spec partitions are replaced. If the current spec is
+unpartitioned, non-empty input replaces all live files, including files under
+older specs. For v3, replacement also removes deletion vectors tied to
+replaced data files. Empty input leaves the table untouched.</p>
+<p>A concurrent add or removal in a replaced partition fails validation, while
+independent changes to other partitions can be retried after a catalog refresh.
+A new target branch also pins the source branch to prevent missing concurrent
+writes. Default partition-spec and sort-order changes fail validation. Written
+data files are not automatically cleaned up if staging or commit fails, so
+callers must handle those files before retrying with a new transaction.</p>
<h3 id="delete"><a class="header" href="#delete">Delete</a></h3>
<pre><code class="language-go">newTbl, err := tbl.Delete(ctx,
iceberg.LessThan(iceberg.Reference("id"), int64(100)),
@@ -507,7 +536,33 @@ if err != nil { /* ... */ }
newTbl, err := txn.Commit(ctx)
</code></pre>
-<p><code>ReplaceDataFilesByPath(ctx, filesToDelete, filesToAdd,
snapshotProps)</code> and <code>ReplaceDataFiles(ctx, filesToDelete,
dataFilesToAdd, snapshotProps, opts...)</code> are also available on
<code>*Transaction</code> for swapping files atomically.</p>
+<p><code>ReplaceDataFilesByPath(ctx, filesToDelete, filesToAdd,
snapshotProps)</code> performs an
+<strong>overwrite</strong> of existing files. It is suitable when the logical
table data
+changes. <code>ReplaceDataFiles(ctx, filesToDelete, dataFilesToAdd,
snapshotProps, opts...)</code>
+is the corresponding data-file metadata API.</p>
+<h3 id="stage-externally-rewritten-parquet-files"><a class="header"
href="#stage-externally-rewritten-parquet-files">Stage externally rewritten
Parquet files</a></h3>
+<p>When another engine has <strong>already written</strong> replacement
Parquet files with the
+same live rows and physical record count, use
+<code>StageRewrittenDataFilesByPath</code>. This stages an Iceberg
<code>replace</code> snapshot
+instead of an <code>overwrite</code>, but it does not read or rewrite the row
data:</p>
+<pre><code class="language-go">txn := tbl.NewTransaction()
+err := txn.StageRewrittenDataFilesByPath(ctx, oldFilePaths, newFilePaths, nil)
+if err != nil { /* ... */ }
+newTbl, err := txn.Commit(ctx)
+</code></pre>
+<p>This path-only helper supports unpartitioned format v1 and v2 tables. It
rejects
+a source file with any applicable position or equality deletes, as well as
+deletion vectors. It requires the same total physical record count and checks
+column value, null, and NaN counts when available for every file on both sides.
+Missing optional statistics are unknown, not zero. A source column with known
+value counts cannot disappear when replacement metrics collection is enabled.
+Footer metadata cannot prove row-level equivalence, so callers must preserve
+every live row. Format v3 and partitioned tables are not supported, including
+older partitioned specs that are no longer current.</p>
+<p>For compaction that must <strong>apply deletes</strong>, remove delete
files, or rewrite
+partitioned data, use <code>RewriteDataFiles</code>. An external writer that
needs to
+supply data-file metadata, a sequence number, or related delete-file changes
+can use <code>NewRewrite</code> with <code>FileToDataFile</code> instead.</p>
<h3 id="transactions"><a class="header"
href="#transactions">Transactions</a></h3>
<p>Group writes and metadata changes into one atomic snapshot:</p>
<pre><code class="language-go">txn := tbl.NewTransaction()
diff --git a/print.html b/print.html
index 24d4cc399..37a3c15ef 100644
--- a/print.html
+++ b/print.html
@@ -1472,6 +1472,35 @@ newTbl, err = tbl.Overwrite(ctx, recordReader, nil,
)
</code></pre>
<p><code>OverwriteTable</code> is the <code>arrow.Table</code> variant.</p>
+<h3 id="dynamic-partition-overwrite"><a class="header"
href="#dynamic-partition-overwrite">Dynamic partition overwrite</a></h3>
+<p>Replace only the partitions present in the incoming data. Unlike a filtered
+row-level overwrite, this removes <strong>all existing data files</strong> in
those partitions
+while retaining files in other partitions.</p>
+<pre><code class="language-go">// Write Arrow record batches, replacing only
partitions receiving new rows.
+newTbl, err := tbl.DynamicPartitionOverwrite(ctx, recordReader, nil)
+
+// In-memory Arrow tables work too.
+newTbl, err = tbl.DynamicPartitionOverwriteTable(ctx, arrowTbl, 1024, nil)
+
+// Or commit already-written Iceberg DataFile metadata through a transaction.
+txn := tbl.NewTransaction()
+err = txn.DynamicPartitionOverwriteDataFiles(ctx, newDataFiles, nil)
+if err == nil {
+ newTbl, err = txn.Commit(ctx)
+}
+</code></pre>
+<p>This supports Iceberg format v1-v3. Incoming files must use the current
+partition spec. On partitioned tables, files under older specs are preserved;
+only matching current-spec partitions are replaced. If the current spec is
+unpartitioned, non-empty input replaces all live files, including files under
+older specs. For v3, replacement also removes deletion vectors tied to
+replaced data files. Empty input leaves the table untouched.</p>
+<p>A concurrent add or removal in a replaced partition fails validation, while
+independent changes to other partitions can be retried after a catalog refresh.
+A new target branch also pins the source branch to prevent missing concurrent
+writes. Default partition-spec and sort-order changes fail validation. Written
+data files are not automatically cleaned up if staging or commit fails, so
+callers must handle those files before retrying with a new transaction.</p>
<h3 id="delete"><a class="header" href="#delete">Delete</a></h3>
<pre><code class="language-go">newTbl, err := tbl.Delete(ctx,
iceberg.LessThan(iceberg.Reference("id"), int64(100)),
@@ -1489,7 +1518,33 @@ if err != nil { /* ... */ }
newTbl, err := txn.Commit(ctx)
</code></pre>
-<p><code>ReplaceDataFilesByPath(ctx, filesToDelete, filesToAdd,
snapshotProps)</code> and <code>ReplaceDataFiles(ctx, filesToDelete,
dataFilesToAdd, snapshotProps, opts...)</code> are also available on
<code>*Transaction</code> for swapping files atomically.</p>
+<p><code>ReplaceDataFilesByPath(ctx, filesToDelete, filesToAdd,
snapshotProps)</code> performs an
+<strong>overwrite</strong> of existing files. It is suitable when the logical
table data
+changes. <code>ReplaceDataFiles(ctx, filesToDelete, dataFilesToAdd,
snapshotProps, opts...)</code>
+is the corresponding data-file metadata API.</p>
+<h3 id="stage-externally-rewritten-parquet-files"><a class="header"
href="#stage-externally-rewritten-parquet-files">Stage externally rewritten
Parquet files</a></h3>
+<p>When another engine has <strong>already written</strong> replacement
Parquet files with the
+same live rows and physical record count, use
+<code>StageRewrittenDataFilesByPath</code>. This stages an Iceberg
<code>replace</code> snapshot
+instead of an <code>overwrite</code>, but it does not read or rewrite the row
data:</p>
+<pre><code class="language-go">txn := tbl.NewTransaction()
+err := txn.StageRewrittenDataFilesByPath(ctx, oldFilePaths, newFilePaths, nil)
+if err != nil { /* ... */ }
+newTbl, err := txn.Commit(ctx)
+</code></pre>
+<p>This path-only helper supports unpartitioned format v1 and v2 tables. It
rejects
+a source file with any applicable position or equality deletes, as well as
+deletion vectors. It requires the same total physical record count and checks
+column value, null, and NaN counts when available for every file on both sides.
+Missing optional statistics are unknown, not zero. A source column with known
+value counts cannot disappear when replacement metrics collection is enabled.
+Footer metadata cannot prove row-level equivalence, so callers must preserve
+every live row. Format v3 and partitioned tables are not supported, including
+older partitioned specs that are no longer current.</p>
+<p>For compaction that must <strong>apply deletes</strong>, remove delete
files, or rewrite
+partitioned data, use <code>RewriteDataFiles</code>. An external writer that
needs to
+supply data-file metadata, a sequence number, or related delete-file changes
+can use <code>NewRewrite</code> with <code>FileToDataFile</code> instead.</p>
<h3 id="transactions"><a class="header"
href="#transactions">Transactions</a></h3>
<p>Group writes and metadata changes into one atomic snapshot:</p>
<pre><code class="language-go">txn := tbl.NewTransaction()
diff --git a/searchindex.js b/searchindex.js
index 8408cc3da..20afc8588 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Object.assign(window.search,
{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#
[...]
\ No newline at end of file
+Object.assign(window.search,
{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#
[...]
\ No newline at end of file
diff --git a/searchindex.json b/searchindex.json
index 45d3bb1ab..6fc3eaebd 100644
--- a/searchindex.json
+++ b/searchindex.json
@@ -1 +1 @@
-{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#4-write-some-arrow-data","get
[...]
\ No newline at end of file
+{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#4-write-some-arrow-data","get
[...]
\ No newline at end of file