diff --git a/pom.xml b/pom.xml index 9e05e0deb..3184a4be2 100644 --- a/pom.xml +++ b/pom.xml @@ -281,6 +281,11 @@ ${iceberg.version} test + + org.apache.iceberg + iceberg-hive-runtime + ${iceberg.version} + @@ -293,6 +298,11 @@ delta-standalone_${scala.binary.version} ${delta.standalone.version} + + io.delta + delta-hive_${scala.binary.version} + ${delta.hive.version} + diff --git a/xtable-core/pom.xml b/xtable-core/pom.xml index 84d4c03fc..68d7a176f 100644 --- a/xtable-core/pom.xml +++ b/xtable-core/pom.xml @@ -101,6 +101,7 @@ io.delta delta-standalone_${scala.binary.version} + test diff --git a/xtable-hive-metastore/pom.xml b/xtable-hive-metastore/pom.xml index 7f66c679b..01037a1fc 100644 --- a/xtable-hive-metastore/pom.xml +++ b/xtable-hive-metastore/pom.xml @@ -46,14 +46,12 @@ org.apache.iceberg iceberg-hive-runtime - ${iceberg.version} io.delta delta-hive_${scala.binary.version} - ${delta.hive.version} diff --git a/xtable-hive-metastore/src/main/java/org/apache/xtable/hms/table/DeltaHMSCatalogTableBuilder.java b/xtable-hive-metastore/src/main/java/org/apache/xtable/hms/table/DeltaHMSCatalogTableBuilder.java index f1f49f3e6..1f5ce4ccf 100644 --- a/xtable-hive-metastore/src/main/java/org/apache/xtable/hms/table/DeltaHMSCatalogTableBuilder.java +++ b/xtable-hive-metastore/src/main/java/org/apache/xtable/hms/table/DeltaHMSCatalogTableBuilder.java @@ -52,11 +52,6 @@ public DeltaHMSCatalogTableBuilder() { this.schemaExtractor = HMSSchemaExtractor.getInstance(); } - @VisibleForTesting - DeltaHMSCatalogTableBuilder(HMSSchemaExtractor schemaExtractor) { - this.schemaExtractor = schemaExtractor; - } - @Override public Table getCreateTableRequest(InternalTable table, CatalogTableIdentifier tableIdentifier) { return newHmsTable(tableIdentifier, getStorageDescriptor(table), getTableParameters()); diff --git a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/HMSCatalogSyncClientTestBase.java b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/HMSCatalogSyncClientTestBase.java index f99057724..cd76c6be9 100644 --- a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/HMSCatalogSyncClientTestBase.java +++ b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/HMSCatalogSyncClientTestBase.java @@ -18,13 +18,16 @@ package org.apache.xtable.hms; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.IMetaStoreClient; import org.apache.hadoop.hive.metastore.api.Database; +import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.StorageDescriptor; import org.apache.hadoop.hive.metastore.api.Table; import org.mockito.Mock; @@ -32,7 +35,11 @@ import org.apache.xtable.conversion.ExternalCatalogConfig; import org.apache.xtable.model.InternalTable; import org.apache.xtable.model.catalog.ThreePartHierarchicalTableIdentifier; +import org.apache.xtable.model.schema.InternalField; +import org.apache.xtable.model.schema.InternalPartitionField; import org.apache.xtable.model.schema.InternalSchema; +import org.apache.xtable.model.schema.InternalType; +import org.apache.xtable.model.schema.PartitionTransformType; import org.apache.xtable.model.storage.CatalogType; import org.apache.xtable.model.storage.TableFormat; @@ -57,23 +64,80 @@ public class HMSCatalogSyncClientTestBase { protected static final String ICEBERG_METADATA_FILE_LOCATION = "base-path/metadata"; protected static final String ICEBERG_METADATA_FILE_LOCATION_V2 = "base-path/v2-metadata"; + protected static final InternalPartitionField PARTITION_FIELD = + InternalPartitionField.builder() + .sourceField( + InternalField.builder() + .name("partitionField") + .schema( + InternalSchema.builder().name("string").dataType(InternalType.STRING).build()) + .build()) + .transformType(PartitionTransformType.VALUE) + .build(); + protected static final InternalSchema INTERNAL_SCHEMA = + InternalSchema.builder() + .dataType(InternalType.RECORD) + .fields( + Arrays.asList( + getInternalField("intField", "int", InternalType.INT), + getInternalField("stringField", "string", InternalType.STRING), + getInternalField("partitionField", "string", InternalType.STRING))) + .build(); + protected static final InternalSchema UPDATED_INTERNAL_SCHEMA = + InternalSchema.builder() + .dataType(InternalType.RECORD) + .fields( + Arrays.asList( + getInternalField("intField", "int", InternalType.INT), + getInternalField("stringField", "string", InternalType.STRING), + getInternalField("partitionField", "string", InternalType.STRING), + getInternalField("booleanField", "boolean", InternalType.BOOLEAN))) + .build(); + protected static final List FIELD_SCHEMA = + Arrays.asList( + getFieldSchema("intField", "int"), + getFieldSchema("stringField", "string"), + getFieldSchema("partitionField", "string")); + protected static final List UPDATED_FIELD_SCHEMA = + Arrays.asList( + getFieldSchema("intField", "int"), + getFieldSchema("stringField", "string"), + getFieldSchema("partitionField", "string"), + getFieldSchema("booleanField", "boolean")); protected static final InternalTable TEST_ICEBERG_INTERNAL_TABLE = InternalTable.builder() .basePath(TEST_BASE_PATH) .tableFormat(TableFormat.ICEBERG) - .readSchema(InternalSchema.builder().fields(Collections.emptyList()).build()) + .readSchema(INTERNAL_SCHEMA) + .partitioningFields(Collections.singletonList(PARTITION_FIELD)) + .build(); + protected static final InternalTable TEST_UPDATED_ICEBERG_INTERNAL_TABLE = + InternalTable.builder() + .basePath(TEST_BASE_PATH) + .tableFormat(TableFormat.ICEBERG) + .readSchema(UPDATED_INTERNAL_SCHEMA) + .partitioningFields(Collections.singletonList(PARTITION_FIELD)) .build(); protected static final InternalTable TEST_DELTA_INTERNAL_TABLE = InternalTable.builder() .basePath(TEST_BASE_PATH) .tableFormat(TableFormat.DELTA) - .readSchema(InternalSchema.builder().fields(Collections.emptyList()).build()) + .readSchema(INTERNAL_SCHEMA) + .partitioningFields(Collections.singletonList(PARTITION_FIELD)) + .build(); + protected static final InternalTable TEST_UPDATED_DELTA_INTERNAL_TABLE = + InternalTable.builder() + .basePath(TEST_BASE_PATH) + .tableFormat(TableFormat.DELTA) + .readSchema(UPDATED_INTERNAL_SCHEMA) + .partitioningFields(Collections.singletonList(PARTITION_FIELD)) .build(); protected static final InternalTable TEST_HUDI_INTERNAL_TABLE = InternalTable.builder() .basePath(TEST_BASE_PATH) .tableFormat(TableFormat.HUDI) - .readSchema(InternalSchema.builder().fields(Collections.emptyList()).build()) + .readSchema(INTERNAL_SCHEMA) + .partitioningFields(Collections.singletonList(PARTITION_FIELD)) .build(); protected static final ThreePartHierarchicalTableIdentifier TEST_CATALOG_TABLE_IDENTIFIER = new ThreePartHierarchicalTableIdentifier(TEST_HMS_DATABASE, TEST_HMS_TABLE); @@ -101,4 +165,16 @@ protected Database newDatabase(String dbName) { return new Database( dbName, "Created by " + HMSCatalogSyncClient.class.getName(), null, Collections.emptyMap()); } + + protected static FieldSchema getFieldSchema(String name, String type) { + return new FieldSchema(name, type, null); + } + + protected static InternalField getInternalField( + String fieldName, String schemaName, InternalType dataType) { + return InternalField.builder() + .name(fieldName) + .schema(InternalSchema.builder().name(schemaName).dataType(dataType).build()) + .build(); + } } diff --git a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/TestHMSCatalogTableBuilderFactory.java b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/TestHMSCatalogTableBuilderFactory.java index 6748b6883..45d45a2da 100644 --- a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/TestHMSCatalogTableBuilderFactory.java +++ b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/TestHMSCatalogTableBuilderFactory.java @@ -18,6 +18,7 @@ package org.apache.xtable.hms; +import static org.apache.xtable.hms.HMSCatalogSyncClientTestBase.FIELD_SCHEMA; import static org.apache.xtable.hms.HMSCatalogSyncClientTestBase.TEST_CATALOG_TABLE_IDENTIFIER; import static org.apache.xtable.hms.HMSCatalogSyncClientTestBase.TEST_HMS_DATABASE; import static org.apache.xtable.hms.HMSCatalogSyncClientTestBase.TEST_HMS_TABLE; @@ -48,7 +49,7 @@ void testNewHmsTable() { expected.setTableName(TEST_HMS_TABLE); expected.setOwner(UserGroupInformation.getCurrentUser().getShortUserName()); expected.setCreateTime((int) createdTime.getEpochSecond()); - expected.setSd(getTestHmsTableStorageDescriptor()); + expected.setSd(getTestHmsTableStorageDescriptor(FIELD_SCHEMA)); expected.setTableType("EXTERNAL_TABLE"); expected.setParameters(getTestHmsTableParameters()); @@ -56,7 +57,7 @@ void testNewHmsTable() { expected, HMSCatalogTableBuilderFactory.newHmsTable( TEST_CATALOG_TABLE_IDENTIFIER, - getTestHmsTableStorageDescriptor(), + getTestHmsTableStorageDescriptor(FIELD_SCHEMA), getTestHmsTableParameters())); } } diff --git a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestDeltaHMSCatalogTableBuilder.java b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestDeltaHMSCatalogTableBuilder.java index 67983df7b..1a7d0cb4f 100644 --- a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestDeltaHMSCatalogTableBuilder.java +++ b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestDeltaHMSCatalogTableBuilder.java @@ -20,13 +20,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import java.time.Instant; -import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import lombok.SneakyThrows; @@ -50,20 +47,13 @@ public class TestDeltaHMSCatalogTableBuilder extends HMSCatalogSyncClientTestBas private DeltaHMSCatalogTableBuilder mockDeltaHmsCatalogSyncRequestProvider; private DeltaHMSCatalogTableBuilder createDeltaHMSCatalogTableBuilder() { - return new DeltaHMSCatalogTableBuilder(mockHmsSchemaExtractor); - } - - void setupCommonMocks() { - mockDeltaHmsCatalogSyncRequestProvider = createDeltaHMSCatalogTableBuilder(); + return new DeltaHMSCatalogTableBuilder(); } @SneakyThrows @Test void testGetCreateTableRequest() { mockDeltaHmsCatalogSyncRequestProvider = createDeltaHMSCatalogTableBuilder(); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.emptyList()); Instant createdTime = Instant.now(); try (MockedStatic mockZonedDateTime = mockStatic(Instant.class)) { @@ -73,7 +63,7 @@ void testGetCreateTableRequest() { expected.setTableName(TEST_HMS_TABLE); expected.setOwner(UserGroupInformation.getCurrentUser().getShortUserName()); expected.setCreateTime((int) createdTime.getEpochSecond()); - expected.setSd(getTestStorageDescriptor()); + expected.setSd(getTestStorageDescriptor(FIELD_SCHEMA)); expected.setTableType("EXTERNAL_TABLE"); expected.setParameters(getTestParameters()); @@ -81,47 +71,36 @@ void testGetCreateTableRequest() { expected, mockDeltaHmsCatalogSyncRequestProvider.getCreateTableRequest( TEST_DELTA_INTERNAL_TABLE, TEST_CATALOG_TABLE_IDENTIFIER)); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema()); } } @SneakyThrows @Test void testGetUpdateTableRequest() { - setupCommonMocks(); + mockDeltaHmsCatalogSyncRequestProvider = createDeltaHMSCatalogTableBuilder(); Table hmsTable = newTable( - TEST_HMS_DATABASE, TEST_HMS_TABLE, getTestParameters(), getTestStorageDescriptor()); - FieldSchema newColumn = new FieldSchema("new_column", "test", null); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.singletonList(newColumn)); + TEST_HMS_DATABASE, + TEST_HMS_TABLE, + getTestParameters(), + getTestStorageDescriptor(FIELD_SCHEMA)); + Table expected = new Table(hmsTable); + expected.getSd().setCols(UPDATED_FIELD_SCHEMA); Table output = mockDeltaHmsCatalogSyncRequestProvider.getUpdateTableRequest( - TEST_DELTA_INTERNAL_TABLE, hmsTable, TEST_CATALOG_TABLE_IDENTIFIER); - Table expected = new Table(hmsTable); - expected.getSd().setCols(Collections.singletonList(newColumn)); - + TEST_UPDATED_DELTA_INTERNAL_TABLE, hmsTable, TEST_CATALOG_TABLE_IDENTIFIER); assertEquals(expected, output); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema()); } @Test void testGetStorageDescriptor() { mockDeltaHmsCatalogSyncRequestProvider = createDeltaHMSCatalogTableBuilder(); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.emptyList()); - StorageDescriptor expected = getTestStorageDescriptor(); + StorageDescriptor expected = getTestStorageDescriptor(FIELD_SCHEMA); assertEquals( expected, mockDeltaHmsCatalogSyncRequestProvider.getStorageDescriptor(TEST_DELTA_INTERNAL_TABLE)); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.DELTA, TEST_DELTA_INTERNAL_TABLE.getReadSchema()); } @Test @@ -131,13 +110,13 @@ void testGetTableParameters() { assertEquals(expected, mockDeltaHmsCatalogSyncRequestProvider.getTableParameters()); } - private StorageDescriptor getTestStorageDescriptor() { + private StorageDescriptor getTestStorageDescriptor(List columns) { Map serDeParams = new HashMap<>(); serDeParams.put("serialization.format", "1"); serDeParams.put("path", TEST_BASE_PATH); StorageDescriptor storageDescriptor = new StorageDescriptor(); - storageDescriptor.setCols(Collections.emptyList()); + storageDescriptor.setCols(columns); storageDescriptor.setLocation(TEST_BASE_PATH); SerDeInfo serDeInfo = new SerDeInfo(); serDeInfo.setParameters(serDeParams); diff --git a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestIcebergHMSCatalogTableBuilder.java b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestIcebergHMSCatalogTableBuilder.java index b0c09a947..14d39c449 100644 --- a/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestIcebergHMSCatalogTableBuilder.java +++ b/xtable-hive-metastore/src/test/java/org/apache/xtable/hms/table/TestIcebergHMSCatalogTableBuilder.java @@ -31,10 +31,12 @@ import java.time.Instant; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import lombok.SneakyThrows; +import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.SerDeInfo; import org.apache.hadoop.hive.metastore.api.StorageDescriptor; import org.apache.hadoop.hive.metastore.api.Table; @@ -51,7 +53,7 @@ import org.apache.iceberg.hadoop.HadoopTables; import org.apache.xtable.hms.HMSCatalogSyncClientTestBase; -import org.apache.xtable.model.storage.TableFormat; +import org.apache.xtable.hms.HMSSchemaExtractor; @ExtendWith(MockitoExtension.class) public class TestIcebergHMSCatalogTableBuilder extends HMSCatalogSyncClientTestBase { @@ -63,12 +65,9 @@ public class TestIcebergHMSCatalogTableBuilder extends HMSCatalogSyncClientTestB private IcebergHMSCatalogTableBuilder mockIcebergHmsCatalogSyncRequestProvider; - private IcebergHMSCatalogTableBuilder createIcebergHMSHelper() { - return new IcebergHMSCatalogTableBuilder(mockHmsSchemaExtractor, mockIcebergHadoopTables); - } - - void setupCommonMocks() { - mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSHelper(); + private IcebergHMSCatalogTableBuilder createIcebergHMSCatalogTableBuilder() { + return new IcebergHMSCatalogTableBuilder( + HMSSchemaExtractor.getInstance(), mockIcebergHadoopTables); } void mockHadoopTables() { @@ -86,11 +85,9 @@ void mockMetadataFileLocation() { @SneakyThrows @Test void testGetCreateTableRequest() { - mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSHelper(); + mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSCatalogTableBuilder(); mockHadoopTables(); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.emptyList()); + Instant createdTime = Instant.now(); try (MockedStatic mockZonedDateTime = mockStatic(Instant.class)) { mockZonedDateTime.when(Instant::now).thenReturn(createdTime); @@ -99,7 +96,7 @@ void testGetCreateTableRequest() { expected.setTableName(TEST_HMS_TABLE); expected.setOwner(UserGroupInformation.getCurrentUser().getShortUserName()); expected.setCreateTime((int) createdTime.getEpochSecond()); - expected.setSd(getTestHmsTableStorageDescriptor()); + expected.setSd(getTestHmsTableStorageDescriptor(FIELD_SCHEMA)); expected.setTableType("EXTERNAL_TABLE"); expected.setParameters(getTestHmsTableParameters()); @@ -107,8 +104,6 @@ void testGetCreateTableRequest() { expected, mockIcebergHmsCatalogSyncRequestProvider.getCreateTableRequest( TEST_ICEBERG_INTERNAL_TABLE, TEST_CATALOG_TABLE_IDENTIFIER)); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema()); verify(mockIcebergBaseTable, times(1)).properties(); verify(mockIcebergHadoopTables, times(1)).load(TEST_BASE_PATH); } @@ -117,52 +112,45 @@ void testGetCreateTableRequest() { @SneakyThrows @Test void testGetUpdateTableRequest() { - setupCommonMocks(); + mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSCatalogTableBuilder(); mockHadoopTables(); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.emptyList()); Map tableParams = new HashMap<>(); tableParams.put(METADATA_LOCATION_PROP, ICEBERG_METADATA_FILE_LOCATION); Table hmsTable = newTable( - TEST_HMS_DATABASE, TEST_HMS_TABLE, tableParams, getTestHmsTableStorageDescriptor()); + TEST_HMS_DATABASE, + TEST_HMS_TABLE, + tableParams, + getTestHmsTableStorageDescriptor(FIELD_SCHEMA)); when(mockIcebergTableMetadata.metadataFileLocation()) .thenReturn(ICEBERG_METADATA_FILE_LOCATION_V2); when(mockIcebergBaseTable.properties()).thenReturn(Collections.emptyMap()); Table output = mockIcebergHmsCatalogSyncRequestProvider.getUpdateTableRequest( - TEST_ICEBERG_INTERNAL_TABLE, hmsTable, TEST_CATALOG_TABLE_IDENTIFIER); + TEST_UPDATED_ICEBERG_INTERNAL_TABLE, hmsTable, TEST_CATALOG_TABLE_IDENTIFIER); tableParams.put(PREVIOUS_METADATA_LOCATION_PROP, ICEBERG_METADATA_FILE_LOCATION); tableParams.put(METADATA_LOCATION_PROP, ICEBERG_METADATA_FILE_LOCATION_V2); - Table expected = - newTable( - TEST_HMS_DATABASE, TEST_HMS_TABLE, tableParams, getTestHmsTableStorageDescriptor()); + Table expected = new Table(hmsTable); + expected.getSd().setCols(UPDATED_FIELD_SCHEMA); + assertEquals(expected, output); assertEquals(tableParams, hmsTable.getParameters()); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema()); } @Test void testGetStorageDescriptor() { - mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSHelper(); - when(mockHmsSchemaExtractor.toColumns( - TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema())) - .thenReturn(Collections.emptyList()); - StorageDescriptor expected = getTestHmsTableStorageDescriptor(); + mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSCatalogTableBuilder(); + StorageDescriptor expected = getTestHmsTableStorageDescriptor(FIELD_SCHEMA); assertEquals( expected, mockIcebergHmsCatalogSyncRequestProvider.getStorageDescriptor(TEST_ICEBERG_INTERNAL_TABLE)); - verify(mockHmsSchemaExtractor, times(1)) - .toColumns(TableFormat.ICEBERG, TEST_ICEBERG_INTERNAL_TABLE.getReadSchema()); } @Test void testGetTableParameters() { - mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSHelper(); + mockIcebergHmsCatalogSyncRequestProvider = createIcebergHMSCatalogTableBuilder(); mockMetadataFileLocation(); when(mockIcebergBaseTable.properties()).thenReturn(Collections.emptyMap()); Map expected = getTestHmsTableParameters(); @@ -173,10 +161,10 @@ void testGetTableParameters() { verify(mockIcebergHadoopTables, never()).load(any()); } - public static StorageDescriptor getTestHmsTableStorageDescriptor() { + public static StorageDescriptor getTestHmsTableStorageDescriptor(List columns) { StorageDescriptor storageDescriptor = new StorageDescriptor(); SerDeInfo serDeInfo = new SerDeInfo(); - storageDescriptor.setCols(Collections.emptyList()); + storageDescriptor.setCols(columns); storageDescriptor.setLocation(TEST_BASE_PATH); storageDescriptor.setInputFormat("org.apache.iceberg.mr.hive.HiveIcebergInputFormat"); storageDescriptor.setOutputFormat("org.apache.iceberg.mr.hive.HiveIcebergOutputFormat");