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)