Author: navis
Date: Fri Jul 11 02:15:37 2014
New Revision: 1609613
URL: http://svn.apache.org/r1609613
Log:
HIVE-3392 : Hive unnecessarily validates table SerDes when dropping a table
(Navis reviewed by Jason Dere)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java Fri Jul
11 02:15:37 2014
@@ -3753,8 +3753,7 @@ public class DDLTask extends Task<DDLWor
tbl.getTTable().getSd().getSerdeInfo().getParameters().putAll(
alterTbl.getProps());
}
- if
(!conf.getStringCollection(ConfVars.SERDESUSINGMETASTOREFORSCHEMA.varname)
- .contains(serdeName)) {
+ if (!Table.hasMetastoreBasedSchema(conf, serdeName)) {
tbl.setFields(Hive.getFieldsFromDeserializer(tbl.getTableName(), tbl.
getDeserializer()));
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java Fri Jul
11 02:15:37 2014
@@ -58,7 +58,6 @@ import org.apache.hadoop.hive.conf.HiveC
import org.apache.hadoop.hive.metastore.HiveMetaException;
import org.apache.hadoop.hive.metastore.HiveMetaHook;
import org.apache.hadoop.hive.metastore.HiveMetaHookLoader;
-import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
import org.apache.hadoop.hive.metastore.IMetaStoreClient;
import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient;
@@ -213,7 +212,6 @@ public class Hive {
/**
* Hive
*
- * @param argFsRoot
* @param c
*
*/
@@ -402,6 +400,7 @@ public class Hive {
if (newTbl.getParameters() != null) {
newTbl.getParameters().remove(hive_metastoreConstants.DDL_TIME);
}
+ newTbl.checkValidity();
getMSC().alter_table(names[0], names[1], newTbl.getTTable());
} catch (MetaException e) {
throw new HiveException("Unable to alter table.", e);
@@ -469,6 +468,7 @@ public class Hive {
if (newPart.getParameters() != null) {
newPart.getParameters().remove(hive_metastoreConstants.DDL_TIME);
}
+ newPart.checkValidity();
getMSC().alter_partition(dbName, tblName, newPart.getTPartition());
} catch (MetaException e) {
@@ -1018,10 +1018,7 @@ public class Hive {
}
}
- Table table = new Table(tTable);
-
- table.checkValidity();
- return table;
+ return new Table(tTable);
}
/**
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java
Fri Jul 11 02:15:37 2014
@@ -33,7 +33,6 @@ import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.common.JavaUtils;
-import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hadoop.hive.metastore.ProtectMode;
import org.apache.hadoop.hive.metastore.Warehouse;
@@ -46,7 +45,6 @@ import org.apache.hadoop.hive.ql.io.Hive
import org.apache.hadoop.hive.ql.io.HiveOutputFormat;
import org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat;
import org.apache.hadoop.hive.serde2.Deserializer;
-import org.apache.hadoop.hive.serde2.SerDeUtils;
import org.apache.hadoop.mapred.InputFormat;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
@@ -504,8 +502,7 @@ public class Partition implements Serial
public List<FieldSchema> getCols() {
try {
- if
(Hive.get().getConf().getStringCollection(ConfVars.SERDESUSINGMETASTOREFORSCHEMA.varname)
- .contains(tPartition.getSd().getSerdeInfo().getSerializationLib())) {
+ if (Table.hasMetastoreBasedSchema(Hive.get().getConf(),
tPartition.getSd())) {
return tPartition.getSd().getCols();
}
return Hive.getFieldsFromDeserializer(table.getTableName(),
getDeserializer());
@@ -644,4 +641,10 @@ public class Partition implements Serial
public Map<List<String>, String> getSkewedColValueLocationMaps() {
return tPartition.getSd().getSkewedInfo().getSkewedColValueLocationMaps();
}
+
+ public void checkValidity() throws HiveException {
+ if (!tPartition.getSd().equals(table.getSd())) {
+ Table.validateColumns(getCols(), table.getPartCols());
+ }
+ }
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java Fri
Jul 11 02:15:37 2014
@@ -23,18 +23,19 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.common.JavaUtils;
+import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hadoop.hive.metastore.ProtectMode;
@@ -58,7 +59,6 @@ import org.apache.hadoop.hive.serde.serd
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.hive.serde2.MetadataTypedColumnsetSerDe;
import org.apache.hadoop.hive.serde2.SerDeException;
-import org.apache.hadoop.hive.serde2.SerDeUtils;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.io.Writable;
@@ -137,7 +137,7 @@ public class Table implements Serializab
}
/**
- * Initialize an emtpy table.
+ * Initialize an empty table.
*/
public static org.apache.hadoop.hive.metastore.api.Table
getEmptyTable(String databaseName, String tableName) {
@@ -210,37 +210,11 @@ public class Table implements Serializab
assert(getViewExpandedText() == null);
}
- Iterator<FieldSchema> iterCols = getCols().iterator();
- List<String> colNames = new ArrayList<String>();
- while (iterCols.hasNext()) {
- String colName = iterCols.next().getName();
- if (!MetaStoreUtils.validateColumnName(colName)) {
- throw new HiveException("Invalid column name '" + colName
- + "' in the table definition");
- }
- Iterator<String> iter = colNames.iterator();
- while (iter.hasNext()) {
- String oldColName = iter.next();
- if (colName.equalsIgnoreCase(oldColName)) {
- throw new HiveException("Duplicate column name " + colName
- + " in the table definition.");
- }
- }
- colNames.add(colName.toLowerCase());
- }
+ validateColumns(getCols(), getPartCols());
+ }
- if (getPartCols() != null) {
- // there is no overlap between columns and partitioning columns
- Iterator<FieldSchema> partColsIter = getPartCols().iterator();
- while (partColsIter.hasNext()) {
- String partCol = partColsIter.next().getName();
- if (colNames.contains(partCol.toLowerCase())) {
- throw new HiveException("Partition column name " + partCol
- + " conflicts with table columns.");
- }
- }
- }
- return;
+ public StorageDescriptor getSd() {
+ return tTable.getSd();
}
public void setInputFormatClass(Class<? extends InputFormat>
inputFormatClass) {
@@ -623,15 +597,15 @@ public class Table implements Serializab
public List<FieldSchema> getCols() {
+ String serializationLib = getSerializationLib();
try {
- if (null == getSerializationLib() ||
Hive.get().getConf().getStringCollection(
-
ConfVars.SERDESUSINGMETASTOREFORSCHEMA.varname).contains(getSerializationLib()))
{
+ if (hasMetastoreBasedSchema(Hive.get().getConf(), serializationLib)) {
return tTable.getSd().getCols();
} else {
return Hive.getFieldsFromDeserializer(getTableName(),
getDeserializer());
}
} catch (HiveException e) {
- LOG.error("Unable to get field from serde: " + getSerializationLib(), e);
+ LOG.error("Unable to get field from serde: " + serializationLib, e);
}
return new ArrayList<FieldSchema>();
}
@@ -1000,4 +974,44 @@ public class Table implements Serializab
public boolean isTemporary() {
return tTable.isTemporary();
}
+
+ public static boolean hasMetastoreBasedSchema(HiveConf conf,
StorageDescriptor serde) {
+ return hasMetastoreBasedSchema(conf,
serde.getSerdeInfo().getSerializationLib());
+ }
+
+ public static boolean hasMetastoreBasedSchema(HiveConf conf, String
serdeLib) {
+ return StringUtils.isEmpty(serdeLib) ||
+
conf.getStringCollection(ConfVars.SERDESUSINGMETASTOREFORSCHEMA.varname).contains(serdeLib);
+ }
+
+ public static void validateColumns(List<FieldSchema> columns,
List<FieldSchema> partCols)
+ throws HiveException {
+ List<String> colNames = new ArrayList<String>();
+ for (FieldSchema partCol: columns) {
+ String colName = normalize(partCol.getName());
+ if (colNames.contains(colName)) {
+ throw new HiveException("Duplicate column name " + colName
+ + " in the table definition.");
+ }
+ colNames.add(colName);
+ }
+ if (partCols != null) {
+ // there is no overlap between columns and partitioning columns
+ for (FieldSchema partCol: partCols) {
+ String colName = normalize(partCol.getName());
+ if (colNames.contains(colName)) {
+ throw new HiveException("Partition column name " + colName
+ + " conflicts with table columns.");
+ }
+ }
+ }
+ }
+
+ private static String normalize(String colName) throws HiveException {
+ if (!MetaStoreUtils.validateColumnName(colName)) {
+ throw new HiveException("Invalid column name '" + colName
+ + "' in the table definition");
+ }
+ return colName.toLowerCase();
+ }
};
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
---
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
(original)
+++
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
Fri Jul 11 02:15:37 2014
@@ -920,7 +920,7 @@ public abstract class BaseSemanticAnalyz
/**
* Sets the table access information.
*
- * @param taInfo The TableAccessInfo structure that is set in the
optimization phase.
+ * @param tableAccessInfo The TableAccessInfo structure that is set in the
optimization phase.
*/
public void setTableAccessInfo(TableAccessInfo tableAccessInfo) {
this.tableAccessInfo = tableAccessInfo;
@@ -1313,7 +1313,7 @@ public abstract class BaseSemanticAnalyz
return getTable(currentDb, tblName, throwException);
}
- // qnName : possibly contains database name (dot seperated)
+ // qnName : possibly contains database name (dot separated)
protected Table getTableWithQN(String qnName, boolean throwException) throws
SemanticException {
int dot = qnName.indexOf('.');
if (dot < 0) {
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java?rev=1609613&r1=1609612&r2=1609613&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
Fri Jul 11 02:15:37 2014
@@ -24,22 +24,20 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.common.JavaUtils;
import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.Order;
import org.apache.hadoop.hive.ql.ErrorMsg;
import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.hive.ql.io.HiveFileFormatUtils;
import org.apache.hadoop.hive.ql.io.HiveOutputFormat;
+import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
import org.apache.hadoop.hive.ql.parse.ParseUtils;
import org.apache.hadoop.hive.ql.parse.SemanticException;
-import org.apache.hadoop.hive.serde2.SerDeUtils;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
@@ -412,8 +410,7 @@ public class CreateTableDesc extends DDL
if ((this.getCols() == null) || (this.getCols().size() == 0)) {
// for now make sure that serde exists
- if (StringUtils.isEmpty(this.getSerName())
- ||
conf.getStringCollection(ConfVars.SERDESUSINGMETASTOREFORSCHEMA.varname).contains(this.getSerName()))
{
+ if (Table.hasMetastoreBasedSchema(conf, getSerName())) {
throw new SemanticException(ErrorMsg.INVALID_TBL_DDL_SERDE.getMsg());
}
return;