This is an automated email from the ASF dual-hosted git repository.
mbod 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 b7b1902b3c0 HIVE-26156: Iceberg delete writer should handle deleting
from old partition specs (#3225) (Marton Bod, reviewed by Adam Szita)
b7b1902b3c0 is described below
commit b7b1902b3c0081454fc14b8866ad93bf716c73c9
Author: Marton Bod <[email protected]>
AuthorDate: Thu Apr 21 09:32:51 2022 +0200
HIVE-26156: Iceberg delete writer should handle deleting from old partition
specs (#3225) (Marton Bod, reviewed by Adam Szita)
---
.../iceberg/mr/hive/HiveIcebergDeleteWriter.java | 8 ++--
.../iceberg/mr/hive/HiveIcebergOutputFormat.java | 10 ++---
.../iceberg/mr/hive/HiveIcebergRecordWriter.java | 11 ++++--
.../iceberg/mr/hive/HiveIcebergStorageHandler.java | 14 ++++++-
.../apache/iceberg/mr/hive/HiveIcebergWriter.java | 20 +++++-----
.../apache/iceberg/mr/hive/IcebergAcidUtil.java | 11 +++---
.../mr/hive/TestHiveIcebergOutputCommitter.java | 5 +--
.../apache/iceberg/mr/hive/TestHiveIcebergV2.java | 44 ++++++++++++++++++++++
.../positive/delete_iceberg_partitioned_avro.q.out | 4 +-
.../positive/delete_iceberg_partitioned_orc.q.out | 4 +-
.../delete_iceberg_partitioned_parquet.q.out | 4 +-
11 files changed, 97 insertions(+), 38 deletions(-)
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergDeleteWriter.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergDeleteWriter.java
index 5e92ae4cff6..a03a1ee1dd6 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergDeleteWriter.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergDeleteWriter.java
@@ -21,6 +21,7 @@ package org.apache.iceberg.mr.hive;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.TaskAttemptID;
import org.apache.iceberg.DeleteFile;
@@ -41,10 +42,10 @@ public class HiveIcebergDeleteWriter extends
HiveIcebergWriter {
private final GenericRecord rowDataTemplate;
- HiveIcebergDeleteWriter(Schema schema, PartitionSpec spec, FileFormat
fileFormat,
+ HiveIcebergDeleteWriter(Schema schema, Map<Integer, PartitionSpec> specs,
FileFormat fileFormat,
FileWriterFactory<Record> writerFactory, OutputFileFactory fileFactory,
FileIO io, long targetFileSize,
TaskAttemptID taskAttemptID, String tableName) {
- super(schema, spec, io, taskAttemptID, tableName,
+ super(schema, specs, io, taskAttemptID, tableName,
new ClusteredPositionDeleteWriter<>(writerFactory, fileFactory, io,
fileFormat, targetFileSize));
rowDataTemplate = GenericRecord.create(schema);
}
@@ -53,7 +54,8 @@ public class HiveIcebergDeleteWriter extends
HiveIcebergWriter {
public void write(Writable row) throws IOException {
Record rec = ((Container<Record>) row).get();
PositionDelete<Record> positionDelete =
IcebergAcidUtil.getPositionDelete(rec, rowDataTemplate);
- writer.write(positionDelete, spec, partition(positionDelete.row()));
+ int specId = IcebergAcidUtil.parseSpecId(rec);
+ writer.write(positionDelete, specs.get(specId),
partition(positionDelete.row(), specId));
}
@Override
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergOutputFormat.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergOutputFormat.java
index 1400d2b0b40..8cb378c470e 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergOutputFormat.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergOutputFormat.java
@@ -33,7 +33,6 @@ import org.apache.hadoop.mapred.OutputFormat;
import org.apache.hadoop.mapred.TaskAttemptID;
import org.apache.hadoop.util.Progressable;
import org.apache.iceberg.FileFormat;
-import org.apache.iceberg.PartitionSpec;
import org.apache.iceberg.Schema;
import org.apache.iceberg.Table;
import org.apache.iceberg.TableProperties;
@@ -69,7 +68,6 @@ public class HiveIcebergOutputFormat<T> implements
OutputFormat<NullWritable, Co
// It gets the config from the FileSinkOperator which has its own config
for every target table
Table table = HiveIcebergStorageHandler.table(jc,
jc.get(hive_metastoreConstants.META_TABLE_NAME));
Schema schema = HiveIcebergStorageHandler.schema(jc);
- PartitionSpec spec = table.spec();
FileFormat fileFormat =
FileFormat.valueOf(PropertyUtil.propertyAsString(table.properties(),
TableProperties.DEFAULT_FILE_FORMAT,
TableProperties.DEFAULT_FILE_FORMAT_DEFAULT).toUpperCase(Locale.ENGLISH));
long targetFileSize = PropertyUtil.propertyAsLong(table.properties(),
TableProperties.WRITE_TARGET_FILE_SIZE_BYTES,
@@ -86,11 +84,11 @@ public class HiveIcebergOutputFormat<T> implements
OutputFormat<NullWritable, Co
HiveFileWriterFactory writerFactory = new HiveFileWriterFactory(table,
fileFormat, schema, null, fileFormat,
null, null, null, schema);
if (HiveIcebergStorageHandler.isDelete(jc, tableName)) {
- return new HiveIcebergDeleteWriter(schema, spec, fileFormat,
writerFactory, outputFileFactory, io, targetFileSize,
- taskAttemptID, tableName);
+ return new HiveIcebergDeleteWriter(schema, table.specs(), fileFormat,
writerFactory, outputFileFactory, io,
+ targetFileSize, taskAttemptID, tableName);
} else {
- return new HiveIcebergRecordWriter(schema, spec, fileFormat,
writerFactory, outputFileFactory, io, targetFileSize,
- taskAttemptID, tableName);
+ return new HiveIcebergRecordWriter(schema, table.specs(),
table.spec().specId(), fileFormat, writerFactory,
+ outputFileFactory, io, targetFileSize, taskAttemptID, tableName);
}
}
}
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergRecordWriter.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergRecordWriter.java
index 6fc26c0526b..f12b1fda20b 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergRecordWriter.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergRecordWriter.java
@@ -21,6 +21,7 @@ package org.apache.iceberg.mr.hive;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.TaskAttemptID;
import org.apache.iceberg.DataFile;
@@ -37,17 +38,21 @@ import org.apache.iceberg.mr.mapred.Container;
class HiveIcebergRecordWriter extends HiveIcebergWriter {
- HiveIcebergRecordWriter(Schema schema, PartitionSpec spec, FileFormat format,
+ private final int currentSpecId;
+
+ HiveIcebergRecordWriter(
+ Schema schema, Map<Integer, PartitionSpec> specs, int currentSpecId,
FileFormat format,
FileWriterFactory<Record> fileWriterFactory, OutputFileFactory
fileFactory, FileIO io, long targetFileSize,
TaskAttemptID taskAttemptID, String tableName) {
- super(schema, spec, io, taskAttemptID, tableName,
+ super(schema, specs, io, taskAttemptID, tableName,
new ClusteredDataWriter<>(fileWriterFactory, fileFactory, io, format,
targetFileSize));
+ this.currentSpecId = currentSpecId;
}
@Override
public void write(Writable row) throws IOException {
Record record = ((Container<Record>) row).get();
- writer.write(record, spec, partition(record));
+ writer.write(record, specs.get(currentSpecId), partition(record,
currentSpecId));
}
@Override
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 4c82eb78cd7..f23b0d16c10 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
@@ -178,8 +178,7 @@ public class HiveIcebergStorageHandler implements
HiveStoragePredicateHandler, H
// For Tez, setting the committer here is enough to make sure it'll be
part of the jobConf
map.put("mapred.output.committer.class",
HiveIcebergNoJobCommitter.class.getName());
// For MR, the jobConf is set only in configureJobConf, so we're setting
the write key here to detect it over there
- String opType = SessionStateUtil.getProperty(conf,
Context.Operation.class.getSimpleName())
- .orElse(Context.Operation.OTHER.name());
+ String opType = getOperationType();
map.put(InputFormatConfig.OPERATION_TYPE_PREFIX +
tableDesc.getTableName(), opType);
// Putting the key into the table props as well, so that projection
pushdown can be determined on a
// table-level and skipped only for output tables in HiveIcebergSerde.
Properties from the map will be present in
@@ -353,6 +352,12 @@ public class HiveIcebergStorageHandler implements
HiveStoragePredicateHandler, H
@Override
public DynamicPartitionCtx createDPContext(HiveConf hiveConf,
org.apache.hadoop.hive.ql.metadata.Table hmsTable)
throws SemanticException {
+ // delete records are already clustered by partition spec id and the hash
of the partition struct
+ // there is no need to do any additional sorting based on partition columns
+ if (getOperationType().equals(Context.Operation.DELETE.name())) {
+ return null;
+ }
+
TableDesc tableDesc = Utilities.getTableDesc(hmsTable);
Table table = IcebergTableUtil.getTable(conf, tableDesc.getProperties());
if (table.spec().isUnpartitioned()) {
@@ -772,6 +777,11 @@ public class HiveIcebergStorageHandler implements
HiveStoragePredicateHandler, H
}
}
+ private String getOperationType() {
+ return SessionStateUtil.getProperty(conf,
Context.Operation.class.getSimpleName())
+ .orElse(Context.Operation.OTHER.name());
+ }
+
private static class NonSerializingConfig implements Serializable {
private final transient Configuration conf;
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergWriter.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergWriter.java
index 42f7ea43a5c..57c13f31cb8 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergWriter.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergWriter.java
@@ -53,18 +53,18 @@ public abstract class HiveIcebergWriter implements
FileSinkOperator.RecordWriter
return writers.get(taskAttemptID);
}
- protected final PartitionKey currentKey;
protected final FileIO io;
protected final InternalRecordWrapper wrapper;
- protected final PartitionSpec spec;
+ protected final Map<Integer, PartitionSpec> specs;
+ protected final Map<Integer, PartitionKey> partitionKeys;
protected final PartitioningWriter writer;
- protected HiveIcebergWriter(Schema schema, PartitionSpec spec, FileIO io,
TaskAttemptID attemptID, String tableName,
- PartitioningWriter writer) {
+ protected HiveIcebergWriter(Schema schema, Map<Integer, PartitionSpec>
specs, FileIO io, TaskAttemptID attemptID,
+ String tableName, PartitioningWriter writer) {
this.io = io;
- this.currentKey = new PartitionKey(spec, schema);
this.wrapper = new InternalRecordWrapper(schema.asStruct());
- this.spec = spec;
+ this.specs = specs;
+ this.partitionKeys = Maps.newHashMapWithExpectedSize(specs.size());
this.writer = writer;
writers.putIfAbsent(attemptID, Maps.newConcurrentMap());
writers.get(attemptID).put(tableName, this);
@@ -100,8 +100,10 @@ public abstract class HiveIcebergWriter implements
FileSinkOperator.RecordWriter
result.dataFiles().size(), result.deleteFiles().size());
}
- protected PartitionKey partition(Record row) {
- currentKey.partition(wrapper.wrap(row));
- return currentKey;
+ protected PartitionKey partition(Record row, int specId) {
+ PartitionKey partitionKey = partitionKeys.computeIfAbsent(specId,
+ id -> new PartitionKey(specs.get(id), specs.get(id).schema()));
+ partitionKey.partition(wrapper.wrap(row));
+ return partitionKey;
}
}
diff --git
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/IcebergAcidUtil.java
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/IcebergAcidUtil.java
index bf59c675f2d..2a358f4fe40 100644
---
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/IcebergAcidUtil.java
+++
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/IcebergAcidUtil.java
@@ -25,7 +25,6 @@ import java.util.Objects;
import org.apache.iceberg.MetadataColumns;
import org.apache.iceberg.Schema;
import org.apache.iceberg.Table;
-import org.apache.iceberg.data.GenericRecord;
import org.apache.iceberg.data.Record;
import org.apache.iceberg.deletes.PositionDelete;
import org.apache.iceberg.relocated.com.google.common.collect.Lists;
@@ -93,7 +92,7 @@ public class IcebergAcidUtil {
* @param rowData The record object to populate with the rowData fields only
* @return The position delete object
*/
- public static PositionDelete<Record> getPositionDelete(Record rec,
GenericRecord rowData) {
+ public static PositionDelete<Record> getPositionDelete(Record rec, Record
rowData) {
PositionDelete<Record> positionDelete = PositionDelete.create();
String filePath =
rec.get(DELETE_SERDE_META_COLS.get(MetadataColumns.FILE_PATH), String.class);
long filePosition =
rec.get(DELETE_SERDE_META_COLS.get(MetadataColumns.ROW_POSITION), Long.class);
@@ -107,21 +106,21 @@ public class IcebergAcidUtil {
return positionDelete;
}
- public static int parseSpecId(GenericRecord rec) {
+ public static int parseSpecId(Record rec) {
return rec.get(DELETE_FILE_READ_META_COLS.get(MetadataColumns.SPEC_ID),
Integer.class);
}
- public static long computePartitionHash(GenericRecord rec) {
+ public static long computePartitionHash(Record rec) {
StructProjection part =
rec.get(DELETE_FILE_READ_META_COLS.get(PARTITION_STRUCT_META_COL),
StructProjection.class);
// we need to compute a hash value for the partition struct so that it can
be used as a sorting key
return computeHash(part);
}
- public static String parseFilePath(GenericRecord rec) {
+ public static String parseFilePath(Record rec) {
return rec.get(DELETE_FILE_READ_META_COLS.get(MetadataColumns.FILE_PATH),
String.class);
}
- public static long parseFilePosition(GenericRecord rec) {
+ public static long parseFilePosition(Record rec) {
return
rec.get(DELETE_FILE_READ_META_COLS.get(MetadataColumns.ROW_POSITION),
Long.class);
}
diff --git
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergOutputCommitter.java
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergOutputCommitter.java
index b72e338a516..4896f0899e3 100644
---
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergOutputCommitter.java
+++
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergOutputCommitter.java
@@ -266,7 +266,6 @@ public class TestHiveIcebergOutputCommitter {
Table table = HiveIcebergStorageHandler.table(conf, name);
FileIO io = table.io();
Schema schema = HiveIcebergStorageHandler.schema(conf);
- PartitionSpec spec = table.spec();
for (int i = 0; i < taskNum; ++i) {
List<Record> records = TestHelper.generateRandomRecords(schema,
RECORD_NUM, i + attemptNum);
@@ -287,8 +286,8 @@ public class TestHiveIcebergOutputCommitter {
null, fileFormat, null, null, null, null);
- HiveIcebergRecordWriter testWriter = new HiveIcebergRecordWriter(schema,
spec, fileFormat,
- hfwf, outputFileFactory, io, TARGET_FILE_SIZE,
+ HiveIcebergRecordWriter testWriter = new HiveIcebergRecordWriter(schema,
table.specs(),
+ table.spec().specId(), fileFormat, hfwf, outputFileFactory, io,
TARGET_FILE_SIZE,
TezUtil.taskAttemptWrapper(taskId), conf.get(Catalogs.NAME));
Container<Record> container = new Container<>();
diff --git
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergV2.java
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergV2.java
index 3d9c07204d4..569a9d3fc3e 100644
---
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergV2.java
+++
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergV2.java
@@ -310,6 +310,50 @@ public class TestHiveIcebergV2 extends
HiveIcebergStorageHandlerWithEngineBase {
HiveIcebergTestUtils.valueForRow(HiveIcebergStorageHandlerTestUtils.CUSTOMER_SCHEMA,
objects), 0);
}
+ @Test
+ public void testDeleteStatementWithPartitionAndSchemaEvolution() {
+ PartitionSpec spec =
PartitionSpec.builderFor(HiveIcebergStorageHandlerTestUtils.CUSTOMER_SCHEMA)
+ .identity("last_name").bucket("customer_id", 16).build();
+
+ // create and insert an initial batch of records
+ testTables.createTable(shell, "customers",
HiveIcebergStorageHandlerTestUtils.CUSTOMER_SCHEMA,
+ spec, fileFormat,
HiveIcebergStorageHandlerTestUtils.OTHER_CUSTOMER_RECORDS_2, 2);
+ // insert one more batch so that we have multiple data files within the
same partition
+
shell.executeStatement(testTables.getInsertQuery(HiveIcebergStorageHandlerTestUtils.OTHER_CUSTOMER_RECORDS_1,
+ TableIdentifier.of("default", "customers"), false));
+
+ // change the partition spec + schema, and insert some new records
+ shell.executeStatement("ALTER TABLE customers SET PARTITION SPEC
(bucket(64, last_name))");
+ shell.executeStatement("ALTER TABLE customers ADD COLUMNS (department
string)");
+ shell.executeStatement("ALTER TABLE customers CHANGE COLUMN first_name
given_name string first");
+ shell.executeStatement("INSERT INTO customers VALUES ('Natalie', 20,
'Bloom', 'Finance'), ('Joanna', 22, " +
+ "'Huberman', 'Operations')");
+
+ // the delete should handle deleting records both from older specs and
from the new spec without problems
+ // there are records with Joanna in both the old and new spec, as well as
the old and new schema
+ shell.executeStatement("DELETE FROM customers WHERE customer_id=3 or
given_name='Joanna'");
+
+ List<Object[]> objects = shell.executeStatement("SELECT * FROM customers
ORDER BY customer_id, last_name");
+ Assert.assertEquals(7, objects.size());
+
+ Schema newSchema = new Schema(
+ optional(2, "given_name", Types.StringType.get()),
+ optional(1, "customer_id", Types.LongType.get()),
+ optional(3, "last_name", Types.StringType.get(), "This is last name"),
+ optional(4, "department", Types.StringType.get())
+ );
+ List<Record> expected = TestHelper.RecordsBuilder.newInstance(newSchema)
+ .add("Sharon", 1L, "Taylor", null)
+ .add("Jake", 2L, "Donnel", null)
+ .add("Susan", 2L, "Morrison", null)
+ .add("Bob", 2L, "Silver", null)
+ .add("Laci", 4L, "Zold", null)
+ .add("Peti", 5L, "Rozsaszin", null)
+ .add("Natalie", 20L, "Bloom", "Finance")
+ .build();
+ HiveIcebergTestUtils.validateData(expected,
HiveIcebergTestUtils.valueForRow(newSchema, objects), 0);
+ }
+
private static <T> PositionDelete<T> positionDelete(CharSequence path, long
pos, T row) {
PositionDelete<T> positionDelete = PositionDelete.create();
return positionDelete.set(path, pos, row);
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_avro.q.out
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_avro.q.out
index 58d06018287..2a6ca684edb 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_avro.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_avro.q.out
@@ -46,8 +46,8 @@ POSTHOOK: query: insert into tbl_ice values (444, 'hola',
800), (555, 'schola',
POSTHOOK: type: QUERY
POSTHOOK: Input: _dummy_database@_dummy_table
POSTHOOK: Output: default@tbl_ice
-Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
-Warning: Shuffle Join MERGEJOIN[59][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
+Warning: Shuffle Join MERGEJOIN[55][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
+Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
PREHOOK: query: delete from tbl_ice where a in (select a from tbl_ice where a
<= 5) or c in (select c from tbl_ice where c > 800)
PREHOOK: type: QUERY
PREHOOK: Input: default@tbl_ice
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_orc.q.out
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_orc.q.out
index 1bd035cdad6..b31e6322a2f 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_orc.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_orc.q.out
@@ -46,8 +46,8 @@ POSTHOOK: query: insert into tbl_ice values (444, 'hola',
800), (555, 'schola',
POSTHOOK: type: QUERY
POSTHOOK: Input: _dummy_database@_dummy_table
POSTHOOK: Output: default@tbl_ice
-Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
-Warning: Shuffle Join MERGEJOIN[59][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
+Warning: Shuffle Join MERGEJOIN[55][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
+Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
PREHOOK: query: delete from tbl_ice where a in (select a from tbl_ice where a
<= 5) or c in (select c from tbl_ice where c > 800)
PREHOOK: type: QUERY
PREHOOK: Input: default@tbl_ice
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_parquet.q.out
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_parquet.q.out
index c2278872824..5535baa16a0 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_parquet.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/delete_iceberg_partitioned_parquet.q.out
@@ -46,8 +46,8 @@ POSTHOOK: query: insert into tbl_ice values (444, 'hola',
800), (555, 'schola',
POSTHOOK: type: QUERY
POSTHOOK: Input: _dummy_database@_dummy_table
POSTHOOK: Output: default@tbl_ice
-Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
-Warning: Shuffle Join MERGEJOIN[59][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
+Warning: Shuffle Join MERGEJOIN[55][tables = [$hdt$_0, $hdt$_1]] in Stage
'Reducer 2' is a cross product
+Warning: Shuffle Join MERGEJOIN[57][tables = [$hdt$_0, $hdt$_1, $hdt$_2,
$hdt$_3]] in Stage 'Reducer 4' is a cross product
PREHOOK: query: delete from tbl_ice where a in (select a from tbl_ice where a
<= 5) or c in (select c from tbl_ice where c > 800)
PREHOOK: type: QUERY
PREHOOK: Input: default@tbl_ice