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 f9aca4376e9 HIVE-26734: Iceberg: Add an option to allow positional
delete files without actual row data. (#3758). (Ayush Saxena, reviewed by Adam
Szita, Denys Kuzmenko)
f9aca4376e9 is described below
commit f9aca4376e95680c78719b5d31811b16b8cb09cd
Author: Ayush Saxena <[email protected]>
AuthorDate: Wed Nov 16 02:09:30 2022 +0530
HIVE-26734: Iceberg: Add an option to allow positional delete files without
actual row data. (#3758). (Ayush Saxena, reviewed by Adam Szita, Denys Kuzmenko)
---
.../mr/hive/writer/HiveIcebergDeleteWriter.java | 11 +-
.../iceberg/mr/hive/writer/WriterBuilder.java | 14 +-
.../mr/hive/writer/HiveIcebergWriterTestBase.java | 24 +-
.../src/test/queries/positive/iceberg_v2_deletes.q | 83 ++++++
.../test/results/positive/iceberg_v2_deletes.q.out | 325 +++++++++++++++++++++
5 files changed, 445 insertions(+), 12 deletions(-)
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/HiveIcebergDeleteWriter.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/HiveIcebergDeleteWriter.java
index b95ba910b63..bd61f101cd9 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/HiveIcebergDeleteWriter.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/HiveIcebergDeleteWriter.java
@@ -41,13 +41,15 @@ import org.apache.iceberg.mr.mapred.Container;
class HiveIcebergDeleteWriter extends HiveIcebergWriterBase {
private final GenericRecord rowDataTemplate;
+ private final boolean skipRowData;
HiveIcebergDeleteWriter(Schema schema, Map<Integer, PartitionSpec> specs,
FileWriterFactory<Record> writerFactory, OutputFileFactory fileFactory,
FileIO io,
- long targetFileSize) {
+ long targetFileSize, boolean skipRowData) {
super(schema, specs, io,
new ClusteredPositionDeleteWriter<>(writerFactory, fileFactory, io,
targetFileSize));
rowDataTemplate = GenericRecord.create(schema);
+ this.skipRowData = skipRowData;
}
@Override
@@ -55,7 +57,12 @@ class HiveIcebergDeleteWriter extends HiveIcebergWriterBase {
Record rec = ((Container<Record>) row).get();
PositionDelete<Record> positionDelete =
IcebergAcidUtil.getPositionDelete(rec, rowDataTemplate);
int specId = IcebergAcidUtil.parseSpecId(rec);
- writer.write(positionDelete, specs.get(specId),
partition(positionDelete.row(), specId));
+ Record rowData = positionDelete.row();
+ if (skipRowData) {
+ // Set null as the row data as we intend to avoid writing the actual row
data in the delete file.
+ positionDelete.set(positionDelete.path(), positionDelete.pos(), null);
+ }
+ writer.write(positionDelete, specs.get(specId), partition(rowData,
specId));
}
@Override
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/WriterBuilder.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/WriterBuilder.java
index 64b4cdd32f2..31073f64018 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/WriterBuilder.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/writer/WriterBuilder.java
@@ -47,6 +47,10 @@ public class WriterBuilder {
// A task may write multiple output files using multiple writers. Each of
them must have a unique operationId.
private static AtomicInteger operationNum = new AtomicInteger(0);
+ // To specify whether to write the actual row data while writing the delete
files.
+ public static final String ICEBERG_DELETE_SKIPROWDATA =
"iceberg.delete.skiprowdata";
+ public static final String ICEBERG_DELETE_SKIPROWDATA_DEFAULT = "true";
+
private WriterBuilder(Table table) {
this.table = table;
}
@@ -92,6 +96,9 @@ public class WriterBuilder {
long targetFileSize = PropertyUtil.propertyAsLong(table.properties(),
TableProperties.WRITE_TARGET_FILE_SIZE_BYTES,
TableProperties.WRITE_TARGET_FILE_SIZE_BYTES_DEFAULT);
+ boolean skipRowData =
+
Boolean.parseBoolean(properties.getOrDefault(ICEBERG_DELETE_SKIPROWDATA,
ICEBERG_DELETE_SKIPROWDATA_DEFAULT));
+
Schema dataSchema = table.schema();
FileIO io = table.io();
Map<Integer, PartitionSpec> specs = table.specs();
@@ -109,14 +116,15 @@ public class WriterBuilder {
.operationId("delete-" + operationId)
.build();
- HiveFileWriterFactory writerFactory = new HiveFileWriterFactory(table,
dataFileFormat, dataSchema, null,
- deleteFileFormat, null, null, null, dataSchema);
+ HiveFileWriterFactory writerFactory =
+ new HiveFileWriterFactory(table, dataFileFormat, dataSchema, null,
deleteFileFormat, null, null, null,
+ skipRowData ? null : dataSchema);
HiveIcebergWriter writer;
switch (operation) {
case DELETE:
writer = new HiveIcebergDeleteWriter(dataSchema, specs, writerFactory,
deleteOutputFileFactory,
- io, targetFileSize);
+ io, targetFileSize, skipRowData);
break;
case OTHER:
writer = new HiveIcebergRecordWriter(dataSchema, specs, currentSpecId,
writerFactory, outputFileFactory,
diff --git
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/writer/HiveIcebergWriterTestBase.java
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/writer/HiveIcebergWriterTestBase.java
index 1a818a131a0..bd3d3aefce2 100644
---
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/writer/HiveIcebergWriterTestBase.java
+++
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/writer/HiveIcebergWriterTestBase.java
@@ -22,6 +22,7 @@ package org.apache.iceberg.mr.hive.writer;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.apache.hadoop.hive.conf.HiveConf;
@@ -83,16 +84,24 @@ public class HiveIcebergWriterTestBase {
@Parameterized.Parameter(1)
public boolean partitioned;
- @Parameterized.Parameters(name = "fileFormat={0}, partitioned={1}")
+ @Parameterized.Parameter(2)
+ public boolean skipRowData;
+
+ @Parameterized.Parameters(name = "fileFormat={0}, partitioned={1},
skipRowData={2}")
public static Collection<Object[]> parameters() {
return Lists.newArrayList(new Object[][] {
- { FileFormat.PARQUET, true },
- { FileFormat.ORC, true },
- { FileFormat.AVRO, true },
- { FileFormat.PARQUET, false },
+ { FileFormat.PARQUET, true, true },
+ { FileFormat.ORC, true, true },
+ { FileFormat.AVRO, true, true },
+ { FileFormat.PARQUET, false, true },
+ { FileFormat.PARQUET, true, false },
+ { FileFormat.ORC, true, false },
+ { FileFormat.AVRO, true, false },
+ { FileFormat.PARQUET, false, false },
// Skip this until the ORC reader is fixed - test only issue
// { FileFormat.ORC, false },
- { FileFormat.AVRO, false }
+ { FileFormat.AVRO, false, true },
+ { FileFormat.AVRO, false, false }
});
}
@@ -105,7 +114,8 @@ public class HiveIcebergWriterTestBase {
PartitionSpec.builderFor(SCHEMA)
.bucket("data", 3)
.build();
- this.helper = new TestHelper(new HiveConf(), tables, location.toString(),
SCHEMA, spec, fileFormat, temp);
+ this.helper = new TestHelper(new HiveConf(), tables, location.toString(),
SCHEMA, spec, fileFormat,
+ Collections.singletonMap(WriterBuilder.ICEBERG_DELETE_SKIPROWDATA,
String.valueOf(skipRowData)), temp);
this.table = helper.createTable();
helper.appendToTable(RECORDS);
diff --git
a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_v2_deletes.q
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_v2_deletes.q
new file mode 100644
index 00000000000..43a1a8033ca
--- /dev/null
+++ b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_v2_deletes.q
@@ -0,0 +1,83 @@
+-- Mask random uuid
+--! qt:replace:/(\s+'uuid'=')\S+('\s*)/$1#Masked#$2/
+
+-- create an unpartitioned table with skip delete data set to false
+ create table ice01 (id int) Stored by Iceberg stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false');
+
+-- check the property value
+show create table ice01;
+
+-- insert some values
+insert into ice01 values (1),(2),(3),(4);
+
+-- check the inserted values
+select * from ice01;
+
+-- delete some values
+delete from ice01 where id>2;
+
+-- check the values, the delete value should be there
+select * from ice01 order by id;
+
+-- insert some more data
+ insert into ice01 values (5),(6),(7),(8);
+
+-- check the values, only the delete value shouldn't be there
+select * from ice01 order by id;
+
+-- delete one value
+delete from ice01 where id=7;
+
+-- change to skip the row data now
+Alter table ice01 set TBLPROPERTIES('iceberg.delete.skiprowdata'='true');
+
+-- check the property value
+show create table ice01;
+
+-- delete some more rows now
+delete from ice01 where id=5;
+
+-- check the entries, the deleted entries shouldn't be there.
+select * from ice01 order by id;
+
+-- create a partitioned table with skip row data set to false
+ create table icepart01 (id int) partitioned by (part int) Stored by Iceberg
stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false');
+
+-- insert some values
+insert into icepart01 values (1,1),(2,1),(3,2),(4,2);
+
+-- check the inserted values
+select * from icepart01 order by id;;
+
+-- delete some values
+delete from icepart01 where id>=2 AND id<4;
+
+-- check the values, the delete value should be there
+select * from icepart01;
+
+-- insert some more data
+ insert into icepart01 values (5,1),(6,2),(7,1),(8,2);
+
+-- check the values, only the delete value shouldn't be there
+select * from icepart01 order by id;
+
+-- delete one value
+delete from icepart01 where id=7;
+
+-- change to skip the row data now
+Alter table icepart01 set TBLPROPERTIES('iceberg.delete.skiprowdata'='true');
+
+-- check the property value
+show create table icepart01;
+
+-- delete some more rows now
+delete from icepart01 where id=5;
+
+-- check the entries, the deleted entries shouldn't be there.
+select * from icepart01 order by id;;
+
+-- clean up
+drop table ice01;
+drop table icepart01;
\ No newline at end of file
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/iceberg_v2_deletes.q.out
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_v2_deletes.q.out
new file mode 100644
index 00000000000..bf7bb4d4bc7
--- /dev/null
+++ b/iceberg/iceberg-handler/src/test/results/positive/iceberg_v2_deletes.q.out
@@ -0,0 +1,325 @@
+PREHOOK: query: create table ice01 (id int) Stored by Iceberg stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@ice01
+POSTHOOK: query: create table ice01 (id int) Stored by Iceberg stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@ice01
+PREHOOK: query: show create table ice01
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@ice01
+POSTHOOK: query: show create table ice01
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@ice01
+CREATE TABLE `ice01`(
+ `id` int)
+ROW FORMAT SERDE
+ 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
+STORED BY
+ 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
+
+LOCATION
+ 'hdfs://### HDFS PATH ###'
+TBLPROPERTIES (
+ 'bucketing_version'='2',
+ 'engine.hive.enabled'='true',
+ 'format-version'='2',
+ 'iceberg.delete.skiprowdata'='false',
+ 'iceberg.orc.files.only'='true',
+ 'metadata_location'='hdfs://### HDFS PATH ###',
+ 'serialization.format'='1',
+ 'table_type'='ICEBERG',
+#### A masked pattern was here ####
+ 'uuid'='#Masked#',
+ 'write.delete.mode'='merge-on-read',
+ 'write.format.default'='orc',
+ 'write.merge.mode'='merge-on-read',
+ 'write.update.mode'='merge-on-read')
+PREHOOK: query: insert into ice01 values (1),(2),(3),(4)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@ice01
+POSTHOOK: query: insert into ice01 values (1),(2),(3),(4)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@ice01
+PREHOOK: query: select * from ice01
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from ice01
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+2
+3
+4
+PREHOOK: query: delete from ice01 where id>2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: default@ice01
+POSTHOOK: query: delete from ice01 where id>2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: default@ice01
+PREHOOK: query: select * from ice01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from ice01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+2
+PREHOOK: query: insert into ice01 values (5),(6),(7),(8)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@ice01
+POSTHOOK: query: insert into ice01 values (5),(6),(7),(8)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@ice01
+PREHOOK: query: select * from ice01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from ice01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+2
+5
+6
+7
+8
+PREHOOK: query: delete from ice01 where id=7
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: default@ice01
+POSTHOOK: query: delete from ice01 where id=7
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: default@ice01
+PREHOOK: query: Alter table ice01 set
TBLPROPERTIES('iceberg.delete.skiprowdata'='true')
+PREHOOK: type: ALTERTABLE_PROPERTIES
+PREHOOK: Input: default@ice01
+PREHOOK: Output: default@ice01
+POSTHOOK: query: Alter table ice01 set
TBLPROPERTIES('iceberg.delete.skiprowdata'='true')
+POSTHOOK: type: ALTERTABLE_PROPERTIES
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: default@ice01
+PREHOOK: query: show create table ice01
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@ice01
+POSTHOOK: query: show create table ice01
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@ice01
+CREATE TABLE `ice01`(
+ `id` int)
+ROW FORMAT SERDE
+ 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
+STORED BY
+ 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
+
+LOCATION
+ 'hdfs://### HDFS PATH ###'
+TBLPROPERTIES (
+ 'bucketing_version'='2',
+ 'engine.hive.enabled'='true',
+ 'format-version'='2',
+ 'iceberg.delete.skiprowdata'='true',
+ 'iceberg.orc.files.only'='true',
+#### A masked pattern was here ####
+ 'metadata_location'='hdfs://### HDFS PATH ###',
+ 'previous_metadata_location'='hdfs://### HDFS PATH ###',
+ 'serialization.format'='1',
+ 'table_type'='ICEBERG',
+#### A masked pattern was here ####
+ 'uuid'='#Masked#',
+ 'write.delete.mode'='merge-on-read',
+ 'write.format.default'='orc',
+ 'write.merge.mode'='merge-on-read',
+ 'write.update.mode'='merge-on-read')
+PREHOOK: query: delete from ice01 where id=5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: default@ice01
+POSTHOOK: query: delete from ice01 where id=5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: default@ice01
+PREHOOK: query: select * from ice01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from ice01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+2
+6
+8
+PREHOOK: query: create table icepart01 (id int) partitioned by (part int)
Stored by Iceberg stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: create table icepart01 (id int) partitioned by (part int)
Stored by Iceberg stored as ORC
+ TBLPROPERTIES('format-version'='2', 'iceberg.delete.skiprowdata'='false')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: insert into icepart01 values (1,1),(2,1),(3,2),(4,2)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: insert into icepart01 values (1,1),(2,1),(3,2),(4,2)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: select * from icepart01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icepart01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 1
+2 1
+3 2
+4 2
+PREHOOK: query: delete from icepart01 where id>=2 AND id<4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: delete from icepart01 where id>=2 AND id<4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: select * from icepart01
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icepart01
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 1
+4 2
+PREHOOK: query: insert into icepart01 values (5,1),(6,2),(7,1),(8,2)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: insert into icepart01 values (5,1),(6,2),(7,1),(8,2)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: select * from icepart01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icepart01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 1
+4 2
+5 1
+6 2
+7 1
+8 2
+PREHOOK: query: delete from icepart01 where id=7
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: delete from icepart01 where id=7
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: Alter table icepart01 set
TBLPROPERTIES('iceberg.delete.skiprowdata'='true')
+PREHOOK: type: ALTERTABLE_PROPERTIES
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: Alter table icepart01 set
TBLPROPERTIES('iceberg.delete.skiprowdata'='true')
+POSTHOOK: type: ALTERTABLE_PROPERTIES
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: show create table icepart01
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@icepart01
+POSTHOOK: query: show create table icepart01
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@icepart01
+CREATE TABLE `icepart01`(
+ `id` int,
+ `part` int)
+PARTITIONED BY SPEC (
+part)
+ROW FORMAT SERDE
+ 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
+STORED BY
+ 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
+
+LOCATION
+ 'hdfs://### HDFS PATH ###'
+TBLPROPERTIES (
+ 'bucketing_version'='2',
+ 'engine.hive.enabled'='true',
+ 'format-version'='2',
+ 'iceberg.delete.skiprowdata'='true',
+ 'iceberg.orc.files.only'='true',
+#### A masked pattern was here ####
+ 'metadata_location'='hdfs://### HDFS PATH ###',
+ 'previous_metadata_location'='hdfs://### HDFS PATH ###',
+ 'serialization.format'='1',
+ 'table_type'='ICEBERG',
+#### A masked pattern was here ####
+ 'uuid'='#Masked#',
+ 'write.delete.mode'='merge-on-read',
+ 'write.format.default'='orc',
+ 'write.merge.mode'='merge-on-read',
+ 'write.update.mode'='merge-on-read')
+PREHOOK: query: delete from icepart01 where id=5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: delete from icepart01 where id=5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: default@icepart01
+PREHOOK: query: select * from icepart01 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icepart01 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 1
+4 2
+6 2
+8 2
+PREHOOK: query: drop table ice01
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@ice01
+PREHOOK: Output: default@ice01
+POSTHOOK: query: drop table ice01
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@ice01
+POSTHOOK: Output: default@ice01
+PREHOOK: query: drop table icepart01
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@icepart01
+PREHOOK: Output: default@icepart01
+POSTHOOK: query: drop table icepart01
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@icepart01
+POSTHOOK: Output: default@icepart01