This is an automated email from the ASF dual-hosted git repository.
ayushsaxena pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 3b2e8a9f4a1 HIVE-27789: Iceberg: Add a way to expire snapshots with
retain last. (#4835). (Ayush Saxena, reviewed by Denys Kuzmenko, zhangbutao)
3b2e8a9f4a1 is described below
commit 3b2e8a9f4a120e269abccdb93a649cf3132ae5de
Author: Ayush Saxena
AuthorDate: Tue Nov 7 07:34:06 2023 +0530
HIVE-27789: Iceberg: Add a way to expire snapshots with retain last.
(#4835). (Ayush Saxena, reviewed by Denys Kuzmenko, zhangbutao)
---
.../iceberg/mr/hive/HiveIcebergStorageHandler.java | 11 +++
.../mr/hive/TestHiveIcebergExpireSnapshots.java | 21 +
.../apache/hadoop/hive/ql/parse/AlterClauseParser.g | 2 ++
.../table/execute/AlterTableExecuteAnalyzer.java| 8 +++-
.../hadoop/hive/ql/parse/AlterTableExecuteSpec.java | 16
5 files changed, 57 insertions(+), 1 deletion(-)
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
index 0afdd79ba55..538c7316779 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
@@ -867,6 +867,8 @@ public class HiveIcebergStorageHandler implements
HiveStoragePredicateHandler, H
expireSnapshotsSpec.getTimestampMillis(), deleteExecutorService);
} else if (expireSnapshotsSpec.isExpireByIds()) {
expireSnapshotByIds(icebergTable,
expireSnapshotsSpec.getIdsToExpire(), deleteExecutorService);
+ } else if (expireSnapshotsSpec.isExpireByRetainLast()) {
+expireSnapshotRetainLast(icebergTable,
expireSnapshotsSpec.getNumRetainLast(), deleteExecutorService);
} else {
expireSnapshotOlderThanTimestamp(icebergTable,
expireSnapshotsSpec.getTimestampMillis(), deleteExecutorService);
}
@@ -877,6 +879,15 @@ public class HiveIcebergStorageHandler implements
HiveStoragePredicateHandler, H
}
}
+ private void expireSnapshotRetainLast(Table icebergTable, int numRetainLast,
ExecutorService deleteExecutorService) {
+ExpireSnapshots expireSnapshots = icebergTable.expireSnapshots();
+expireSnapshots.retainLast(numRetainLast);
+if (deleteExecutorService != null) {
+ expireSnapshots.executeDeleteWith(deleteExecutorService);
+}
+expireSnapshots.commit();
+ }
+
private void expireSnapshotByTimestampRange(Table icebergTable, Long
fromTimestamp, Long toTimestamp,
ExecutorService deleteExecutorService) {
ExpireSnapshots expireSnapshots = icebergTable.expireSnapshots();
diff --git
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergExpireSnapshots.java
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergExpireSnapshots.java
index a851578ee6c..8fd808f4fed 100644
---
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergExpireSnapshots.java
+++
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergExpireSnapshots.java
@@ -28,6 +28,8 @@ import org.apache.iceberg.catalog.TableIdentifier;
import org.junit.Assert;
import org.junit.Test;
+import static org.apache.iceberg.TableProperties.MAX_SNAPSHOT_AGE_MS;
+
/**
* Tests covering the rollback feature
*/
@@ -82,4 +84,23 @@ public class TestHiveIcebergExpireSnapshots extends
HiveIcebergStorageHandlerWit
table.refresh();
Assert.assertEquals(6, IterableUtils.size(table.snapshots()));
}
+
+ @Test
+ public void testExpireSnapshotsWithRetainLast() throws IOException,
InterruptedException {
+TableIdentifier identifier = TableIdentifier.of("default", "source");
+Table table = testTables.createTableWithVersions(shell, identifier.name(),
+HiveIcebergStorageHandlerTestUtils.CUSTOMER_SCHEMA, fileFormat,
+HiveIcebergStorageHandlerTestUtils.CUSTOMER_RECORDS, 10);
+// No snapshot should expire, since the max snapshot age to expire is by
default 5 days
+shell.executeStatement("ALTER TABLE " + identifier.name() + " EXECUTE
EXPIRE_SNAPSHOTS RETAIN LAST 5");
+table.refresh();
+Assert.assertEquals(10, IterableUtils.size(table.snapshots()));
+
+// Change max snapshot age to expire to 1 ms & re-execute, this time it
should retain only 5
+shell.executeStatement(
+"ALTER TABLE " + identifier.name() + " SET TBLPROPERTIES('" +
MAX_SNAPSHOT_AGE_MS + "'='1')");
+shell.executeStatement("ALTER TABLE " + identifier.name() + " EXECUTE
EXPIRE_SNAPSHOTS RETAIN LAST 5");
+table.refresh();
+Assert.assertEquals(5, IterableUtils.size(table.snapshots()));
+ }