diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieMergeHandle.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieMergeHandle.java index 92fa5c28394a5..4d6427880c9e4 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieMergeHandle.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieMergeHandle.java @@ -61,6 +61,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; import java.util.Map; import java.util.Set; @@ -117,16 +118,14 @@ public HoodieMergeHandle(HoodieWriteConfig config, String instantTime, HoodieTab Iterator> recordItr, String partitionPath, String fileId, TaskContextSupplier taskContextSupplier, Option keyGeneratorOpt) { this(config, instantTime, hoodieTable, recordItr, partitionPath, fileId, taskContextSupplier, - hoodieTable.getBaseFileOnlyView().getLatestBaseFile(partitionPath, fileId).get(), keyGeneratorOpt); + getLatestBaseFile(hoodieTable, partitionPath, fileId), keyGeneratorOpt); } public HoodieMergeHandle(HoodieWriteConfig config, String instantTime, HoodieTable hoodieTable, Iterator> recordItr, String partitionPath, String fileId, TaskContextSupplier taskContextSupplier, HoodieBaseFile baseFile, Option keyGeneratorOpt) { super(config, instantTime, partitionPath, fileId, hoodieTable, taskContextSupplier); - init(fileId, recordItr); - init(fileId, partitionPath, baseFile); - validateAndSetAndKeyGenProps(keyGeneratorOpt, config.populateMetaFields()); + init(recordItr, baseFile, keyGeneratorOpt); } /** @@ -139,8 +138,7 @@ public HoodieMergeHandle(HoodieWriteConfig config, String instantTime, HoodieTab this.keyToNewRecords = keyToNewRecords; this.useWriterSchemaForCompaction = true; this.preserveMetadata = config.isPreserveHoodieCommitMetadataForCompaction(); - init(fileId, this.partitionPath, dataFileToBeMerged); - validateAndSetAndKeyGenProps(keyGeneratorOpt, config.populateMetaFields()); + init(null, dataFileToBeMerged, keyGeneratorOpt); } private void validateAndSetAndKeyGenProps(Option keyGeneratorOpt, boolean populateMetaFields) { @@ -148,6 +146,22 @@ private void validateAndSetAndKeyGenProps(Option keyGeneratorO this.keyGeneratorOpt = keyGeneratorOpt; } + private void init(Iterator> recordItr, HoodieBaseFile baseFile, Option keyGeneratorOpt) { + if (recordItr != null) { + init(this.fileId, recordItr); + } + init(this.fileId, this.partitionPath, baseFile); + validateAndSetAndKeyGenProps(keyGeneratorOpt, this.config.populateMetaFields()); + } + + public static HoodieBaseFile getLatestBaseFile(HoodieTable hoodieTable, String partitionPath, String fileId) { + Option baseFileOp = hoodieTable.getBaseFileOnlyView().getLatestBaseFile(partitionPath, fileId); + if (!baseFileOp.isPresent()) { + throw new NoSuchElementException(String.format("FileID %s of partition path %s does not exist.", fileId, partitionPath)); + } + return baseFileOp.get(); + } + @Override public Schema getWriterSchemaWithMetaFields() { return writeSchemaWithMetaFields;