vanliu-tx opened a new issue #1092:
URL: https://github.com/apache/iceberg/issues/1092


   In iceberg-hive module, I found that, when I delete a column which is just 
before another column with different type, the operation failed with a 
RuntimeException. @rdblue @aokolnychyi 
   
   
   I added some code in HiveTableTest#testExistingTableUpdate() to demonstrate 
this issue:
   
   ```java
     public void testExistingTableUpdate() throws TException {
       Table icebergTable = catalog.loadTable(TABLE_IDENTIFIER);
       // add a column
       icebergTable.updateSchema().addColumn("data", 
Types.LongType.get()).commit();
   
       icebergTable = catalog.loadTable(TABLE_IDENTIFIER);
   
       // Only 2 snapshotFile Should exist and no manifests should exist
       Assert.assertEquals(2, metadataVersionFiles(TABLE_NAME).size());
       Assert.assertEquals(0, manifestFiles(TABLE_NAME).size());
       Assert.assertEquals(altered.asStruct(), 
icebergTable.schema().asStruct());
   
       final org.apache.hadoop.hive.metastore.api.Table table = 
metastoreClient.getTable(DB_NAME, TABLE_NAME);
       final List<String> hiveColumns = table.getSd().getCols().stream()
           .map(FieldSchema::getName)
           .collect(Collectors.toList());
       final List<String> icebergColumns = altered.columns().stream()
           .map(Types.NestedField::name)
           .collect(Collectors.toList());
       Assert.assertEquals(icebergColumns, hiveColumns);
   
       UpdateSchema us = icebergTable.updateSchema();
       us.addColumn("str1", Types.StringType.get());
       us.addColumn("str2", Types.StringType.get());
       us.addColumn("long1", Types.LongType.get());
       us.addColumn("str3", Types.StringType.get());
       us.addColumn("int1", Types.IntegerType.get());
       us.commit();
   
       UpdateSchema us1 = icebergTable.updateSchema();
       us1.deleteColumn("str2");
       AssertHelpers.assertThrows("unable to delete a string field before long 
field", RuntimeException.class, "InvalidOperationException", () -> 
us1.commit());
   
       UpdateSchema us2 = icebergTable.updateSchema();
       us2.deleteColumn("str3");
       AssertHelpers.assertThrows("unable to delete a string field before 
integer field", RuntimeException.class, "InvalidOperationException", () -> 
us2.commit());
   
       UpdateSchema us3 = icebergTable.updateSchema();
       us3.deleteColumn("long1");
       AssertHelpers.assertThrows("unable to delete a long field before string 
field", RuntimeException.class, "InvalidOperationException", () -> 
us3.commit());
   
       UpdateSchema us4 = icebergTable.updateSchema();
       us4.deleteColumn("long1");
       us4.deleteColumn("str3");
       us4.deleteColumn("int1");
       us4.commit();
   
     }
   ```
   
   you can see that delete a string field before long/integer field failed, 
delete a long field before string field also failed. The actual exception and 
stack trace are:
   
   ```
   [pool-6-thread-2] ERROR org.apache.hadoop.hive.metastore.RetryingHMSHandler 
- InvalidOperationException(message:The following columns have types 
incompatible with the existing columns in their respective positions :
   long1,int1)
        at 
org.apache.hadoop.hive.metastore.MetaStoreUtils.throwExceptionIfIncompatibleColTypeChange(MetaStoreUtils.java:641)
        at 
org.apache.hadoop.hive.metastore.HiveAlterHandler.alterTable(HiveAlterHandler.java:157)
        at 
org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.alter_table_core(HiveMetaStore.java:4013)
        at 
org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.alter_table_with_environment_context(HiveMetaStore.java:3984)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.apache.hadoop.hive.metastore.RetryingHMSHandler.invokeInternal(RetryingHMSHandler.java:148)
        at 
org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:107)
        at com.sun.proxy.$Proxy19.alter_table_with_environment_context(Unknown 
Source)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$alter_table_with_environment_context.getResult(ThriftHiveMetastore.java:11631)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$alter_table_with_environment_context.getResult(ThriftHiveMetastore.java:11615)
        at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
        at 
org.apache.hadoop.hive.metastore.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:48)
        at 
org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
   
   InvalidOperationException(message:The following columns have types 
incompatible with the existing columns in their respective positions :
   long1,int1)
   java.lang.RuntimeException: InvalidOperationException(message:The following 
columns have types incompatible with the existing columns in their respective 
positions :
   long1,int1)
        at com.google.common.base.Throwables.propagate(Throwables.java:241)
        at 
org.apache.iceberg.common.DynMethods$UnboundMethod.invoke(DynMethods.java:79)
        at 
org.apache.iceberg.hive.HiveTableOperations.lambda$doCommit$2(HiveTableOperations.java:186)
        at org.apache.iceberg.hive.ClientPool.run(ClientPool.java:54)
        at 
org.apache.iceberg.hive.HiveTableOperations.doCommit(HiveTableOperations.java:182)
        at 
org.apache.iceberg.BaseMetastoreTableOperations.commit(BaseMetastoreTableOperations.java:103)
        at org.apache.iceberg.SchemaUpdate.commit(SchemaUpdate.java:359)
        at 
org.apache.iceberg.hive.HiveTableTest.testExistingTableUpdate(HiveTableTest.java:254)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at 
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at 
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at 
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
        at 
org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
        at 
org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
        at 
org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at 
org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
        at 
org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
        at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
        at 
org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
        at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at 
org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
        at 
org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
        at 
org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
        at 
org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at 
org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at 
org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
        at java.lang.Thread.run(Thread.java:748)
   Caused by: InvalidOperationException(message:The following columns have 
types incompatible with the existing columns in their respective positions :
   long1,int1)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$alter_table_with_environment_context_result$alter_table_with_environment_context_resultStandardScheme.read(ThriftHiveMetastore.java:59744)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$alter_table_with_environment_context_result$alter_table_with_environment_context_resultStandardScheme.read(ThriftHiveMetastore.java:59730)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$alter_table_with_environment_context_result.read(ThriftHiveMetastore.java:59672)
        at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:86)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_alter_table_with_environment_context(ThriftHiveMetastore.java:1693)
        at 
org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.alter_table_with_environment_context(ThriftHiveMetastore.java:1677)
        at 
org.apache.hadoop.hive.metastore.HiveMetaStoreClient.alter_table_with_environmentContext(HiveMetaStoreClient.java:375)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.apache.iceberg.common.DynMethods$UnboundMethod.invokeChecked(DynMethods.java:64)
        at 
org.apache.iceberg.common.DynMethods$UnboundMethod.invoke(DynMethods.java:76)
        ... 57 more
   
   
   ```
   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to