Rajat Khandelwal created HIVE-11278:
---------------------------------------

             Summary: Partition.setOutputFormatClass should not do toString for 
Class object 
                 Key: HIVE-11278
                 URL: https://issues.apache.org/jira/browse/HIVE-11278
             Project: Hive
          Issue Type: Bug
            Reporter: Rajat Khandelwal


https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java#L286

inside setInputFormatClass, we're doing:

{noformat}
 public void setInputFormatClass(Class<? extends InputFormat> inputFormatClass) 
{
    this.inputFormatClass = inputFormatClass;
    tPartition.getSd().setInputFormat(inputFormatClass.getName());
  }
{noformat}

But inside setOutputFormatClass, we're doing toString for class, instead of 
getName().

{noformat}
  public void setOutputFormatClass(Class<? extends HiveOutputFormat> 
outputFormatClass) {
    this.outputFormatClass = outputFormatClass;
    tPartition.getSd().setOutputFormat(HiveFileFormatUtils
        .getOutputFormatSubstitute(outputFormatClass).toString());
  }
{noformat}

Difference is that, for Class A.class, toString is "class A.class", getName is 
"A.class". So Class.forName(cls.getName()) succeeds, but 
Class.forName(cls.toString()) is not valid. 


So if you get a partition, set outputformat, and make an alter call, then get 
the partition again and make a getOutputFormatClass call on that object, it 
throws a ClassNotFoundException on 
https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java#L316,
 because it's basically calling Class.forName("class a.b.c.ClassName.class") 
which is wrong!





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to