Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1145801) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -3223,31 +3223,83 @@ */ private int createTableLike(Hive db, CreateTableLikeDesc crtTbl) throws HiveException { // Get the existing table - Table tbl = db.getTable(crtTbl.getLikeTableName()); + Table oldtbl = db.getTable(crtTbl.getLikeTableName()); + Table tbl; + if (oldtbl.getTableType() == TableType.VIRTUAL_VIEW) { + String targetTableName = crtTbl.getTableName(); + tbl=db.newTable(targetTableName); - // find out database name and table name of target table - String targetTableName = crtTbl.getTableName(); - Table newTable = db.newTable(targetTableName); + tbl.setTableType(TableType.MANAGED_TABLE); - tbl.setDbName(newTable.getDbName()); - tbl.setTableName(newTable.getTableName()); + if (crtTbl.isExternal()) { + tbl.setProperty("EXTERNAL", "TRUE"); + tbl.setTableType(TableType.EXTERNAL_TABLE); + } else { + tbl.setProperty("EXTERNAL", "FALSE"); + } - if (crtTbl.isExternal()) { - tbl.setProperty("EXTERNAL", "TRUE"); + tbl.setFields(oldtbl.getCols()); + tbl.setPartCols(oldtbl.getPartCols()); + + if (crtTbl.getDefaultSerName() == null) { + LOG.info("Default to LazySimpleSerDe for table " + crtTbl.getTableName()); + tbl.setSerializationLib(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class.getName()); + } else { + // let's validate that the serde exists + validateSerDe(crtTbl.getDefaultSerName()); + tbl.setSerializationLib(crtTbl.getDefaultSerName()); + } + + if (crtTbl.getDefaultSerdeProps() != null) { + Iterator> iter = crtTbl.getDefaultSerdeProps().entrySet() + .iterator(); + while (iter.hasNext()) { + Entry m = iter.next(); + tbl.setSerdeParam(m.getKey(), m.getValue()); + } + } + + tbl.setInputFormatClass(crtTbl.getDefaultInputFormat()); + tbl.setOutputFormatClass(crtTbl.getDefaultOutputFormat()); + + tbl.getTTable().getSd().setInputFormat( + tbl.getInputFormatClass().getName()); + tbl.getTTable().getSd().setOutputFormat( + tbl.getOutputFormatClass().getName()); + + // reset owner and creation time + int rc = setGenericTableAttributes(tbl); + if (rc != 0) { + return rc; + } } else { - tbl.setProperty("EXTERNAL", "FALSE"); - } + tbl=oldtbl; - if (crtTbl.getLocation() != null) { - tbl.setDataLocation(new Path(crtTbl.getLocation()).toUri()); - } else { - tbl.unsetDataLocation(); + // find out database name and table name of target table + String targetTableName = crtTbl.getTableName(); + Table newTable = db.newTable(targetTableName); + + tbl.setDbName(newTable.getDbName()); + tbl.setTableName(newTable.getTableName()); + + if (crtTbl.isExternal()) { + tbl.setProperty("EXTERNAL", "TRUE"); + tbl.setTableType(TableType.EXTERNAL_TABLE); + } else { + tbl.setProperty("EXTERNAL", "FALSE"); + } + + if (crtTbl.getLocation() != null) { + tbl.setDataLocation(new Path(crtTbl.getLocation()).toUri()); + } else { + tbl.unsetDataLocation(); + } + + // we should reset table specific parameters including (stats, lastDDLTime etc.) + Map params = tbl.getParameters(); + params.clear(); } - // we should reset table specific parameters including (stats, lastDDLTime etc.) - Map params = tbl.getParameters(); - params.clear(); - // create the table db.createTable(tbl, crtTbl.getIfNotExists()); work.getOutputs().add(new WriteEntity(tbl)); Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 1145801) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -7735,8 +7735,9 @@ break; case CTLT: // create table like - CreateTableLikeDesc crtTblLikeDesc = new CreateTableLikeDesc(tableName, - isExt, location, ifNotExists, likeTableName); + CreateTableLikeDesc crtTblLikeDesc = new CreateTableLikeDesc(tableName, isExt, + storageFormat.inputFormat, storageFormat.outputFormat, location, + shared.serde, shared.serdeProps, ifNotExists, likeTableName); SessionState.get().setCommandType(HiveOperation.CREATETABLE); rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), crtTblLikeDesc), conf)); Index: ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java (revision 1145801) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableLikeDesc.java (working copy) @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.plan; import java.io.Serializable; +import java.util.Map; /** * CreateTableLikeDesc. @@ -29,6 +30,10 @@ private static final long serialVersionUID = 1L; String tableName; boolean isExternal; + String defaultInputFormat; + String defaultOutputFormat; + String defaultSerName; + Map defaultSerdeProps; String location; boolean ifNotExists; String likeTableName; @@ -37,9 +42,15 @@ } public CreateTableLikeDesc(String tableName, boolean isExternal, - String location, boolean ifNotExists, String likeTableName) { + String defaultInputFormat, String defaultOutputFormat, String location, + String defaultSerName, Map defaultSerdeProps, boolean ifNotExists, + String likeTableName) { this.tableName = tableName; this.isExternal = isExternal; + this.defaultInputFormat=defaultInputFormat; + this.defaultOutputFormat=defaultOutputFormat; + this.defaultSerName=defaultSerName; + this.defaultSerdeProps=defaultSerdeProps; this.location = location; this.ifNotExists = ifNotExists; this.likeTableName = likeTableName; @@ -63,6 +74,24 @@ this.tableName = tableName; } + @Explain(displayName = "default input format") + public String getDefaultInputFormat() { + return defaultInputFormat; + } + + public void setInputFormat(String inputFormat) { + this.defaultInputFormat = inputFormat; + } + + @Explain(displayName = "default output format") + public String getDefaultOutputFormat() { + return defaultOutputFormat; + } + + public void setOutputFormat(String outputFormat) { + this.defaultOutputFormat = outputFormat; + } + @Explain(displayName = "location") public String getLocation() { return location; @@ -81,6 +110,38 @@ this.isExternal = isExternal; } + /** + * @return the default serDeName + */ + @Explain(displayName = "default serde name") + public String getDefaultSerName() { + return defaultSerName; + } + + /** + * @param serName + * the serName to set + */ + public void setDefaultSerName(String serName) { + this.defaultSerName = serName; + } + + /** + * @return the default serDe properties + */ + @Explain(displayName = "serde properties") + public Map getDefaultSerdeProps() { + return defaultSerdeProps; + } + + /** + * @param serdeProps + * the default serde properties to set + */ + public void setDefaultSerdeProps(Map serdeProps) { + this.defaultSerdeProps = serdeProps; + } + @Explain(displayName = "like") public String getLikeTableName() { return likeTableName; Index: ql/src/test/queries/clientpositive/create_like.q =================================================================== --- ql/src/test/queries/clientpositive/create_like.q (revision 1145801) +++ ql/src/test/queries/clientpositive/create_like.q (working copy) @@ -3,20 +3,20 @@ CREATE TABLE table1 (a STRING, b STRING) STORED AS TEXTFILE; -DESCRIBE table1; -DESCRIBE EXTENDED table1; +DESCRIBE FORMATTED table1; +DESCRIBE FORMATTED table1; CREATE TABLE table2 LIKE table1; -DESCRIBE table2; -DESCRIBE EXTENDED table2; +DESCRIBE FORMATTED table2; +DESCRIBE FORMATTED table2; CREATE TABLE IF NOT EXISTS table2 LIKE table1; CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE table1; CREATE EXTERNAL TABLE IF NOT EXISTS table3 LIKE table1; -DESCRIBE table3; -DESCRIBE EXTENDED table3; +DESCRIBE FORMATTED table3; +DESCRIBE FORMATTED table3; INSERT OVERWRITE TABLE table1 SELECT key, value FROM src WHERE key = 86; INSERT OVERWRITE TABLE table2 SELECT key, value FROM src WHERE key = 100; @@ -24,6 +24,3 @@ SELECT * FROM table1; SELECT * FROM table2; - - - Index: ql/src/test/results/clientpositive/create_like.q.out =================================================================== --- ql/src/test/results/clientpositive/create_like.q.out (revision 1145801) +++ ql/src/test/results/clientpositive/create_like.q.out (working copy) @@ -3,39 +3,135 @@ POSTHOOK: query: CREATE TABLE table1 (a STRING, b STRING) STORED AS TEXTFILE POSTHOOK: type: CREATETABLE POSTHOOK: Output: default@table1 -PREHOOK: query: DESCRIBE table1 +PREHOOK: query: DESCRIBE FORMATTED table1 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE table1 +POSTHOOK: query: DESCRIBE FORMATTED table1 POSTHOOK: type: DESCTABLE -a string -b string -PREHOOK: query: DESCRIBE EXTENDED table1 +# col_name data_type comment + +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:12 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table1 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511612 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 +PREHOOK: query: DESCRIBE FORMATTED table1 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE EXTENDED table1 +POSTHOOK: query: DESCRIBE FORMATTED table1 POSTHOOK: type: DESCTABLE -a string -b string +# col_name data_type comment -Detailed Table Information Table(tableName:table1, dbName:default, owner:thiruvel, createTime:1286798759, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/home/thiruvel/projects/hive/hive.unsecure/build/ql/test/data/warehouse/table1, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1286798759}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:12 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table1 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511612 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 PREHOOK: query: CREATE TABLE table2 LIKE table1 PREHOOK: type: CREATETABLE POSTHOOK: query: CREATE TABLE table2 LIKE table1 POSTHOOK: type: CREATETABLE POSTHOOK: Output: default@table2 -PREHOOK: query: DESCRIBE table2 +PREHOOK: query: DESCRIBE FORMATTED table2 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE table2 +POSTHOOK: query: DESCRIBE FORMATTED table2 POSTHOOK: type: DESCTABLE -a string -b string -PREHOOK: query: DESCRIBE EXTENDED table2 +# col_name data_type comment + +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:13 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table2 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511613 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 +PREHOOK: query: DESCRIBE FORMATTED table2 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE EXTENDED table2 +POSTHOOK: query: DESCRIBE FORMATTED table2 POSTHOOK: type: DESCTABLE -a string -b string +# col_name data_type comment -Detailed Table Information Table(tableName:table2, dbName:default, owner:thiruvel, createTime:1286798760, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/home/thiruvel/projects/hive/hive.unsecure/build/ql/test/data/warehouse/table2, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{EXTERNAL=FALSE, transient_lastDdlTime=1286798760}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:13 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table2 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511613 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 PREHOOK: query: CREATE TABLE IF NOT EXISTS table2 LIKE table1 PREHOOK: type: CREATETABLE POSTHOOK: query: CREATE TABLE IF NOT EXISTS table2 LIKE table1 @@ -49,20 +145,68 @@ POSTHOOK: query: CREATE EXTERNAL TABLE IF NOT EXISTS table3 LIKE table1 POSTHOOK: type: CREATETABLE POSTHOOK: Output: default@table3 -PREHOOK: query: DESCRIBE table3 +PREHOOK: query: DESCRIBE FORMATTED table3 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE table3 +POSTHOOK: query: DESCRIBE FORMATTED table3 POSTHOOK: type: DESCTABLE -a string -b string -PREHOOK: query: DESCRIBE EXTENDED table3 +# col_name data_type comment + +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:13 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table3 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511613 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 +PREHOOK: query: DESCRIBE FORMATTED table3 PREHOOK: type: DESCTABLE -POSTHOOK: query: DESCRIBE EXTENDED table3 +POSTHOOK: query: DESCRIBE FORMATTED table3 POSTHOOK: type: DESCTABLE -a string -b string +# col_name data_type comment -Detailed Table Information Table(tableName:table3, dbName:default, owner:thiruvel, createTime:1286798760, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:string, comment:null), FieldSchema(name:b, type:string, comment:null)], location:pfile:/home/thiruvel/projects/hive/hive.unsecure/build/ql/test/data/warehouse/table3, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1286798760}, viewOriginalText:null, viewExpandedText:null, tableType:EXTERNAL_TABLE) +a string None +b string None + +# Detailed Table Information +Database: default +Owner: charleschen +CreateTime: Tue Jul 12 16:00:13 PDT 2011 +LastAccessTime: UNKNOWN +Protect Mode: None +Retention: 0 +Location: pfile:/Users/charleschen/hive-trunk7/build/ql/test/data/warehouse/table3 +Table Type: MANAGED_TABLE +Table Parameters: + transient_lastDdlTime 1310511613 + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 PREHOOK: query: INSERT OVERWRITE TABLE table1 SELECT key, value FROM src WHERE key = 86 PREHOOK: type: QUERY PREHOOK: Input: default@src @@ -88,11 +232,11 @@ PREHOOK: query: SELECT * FROM table1 PREHOOK: type: QUERY PREHOOK: Input: default@table1 -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-06-07_038_1626206004888639/-mr-10000 +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-12_16-00-25_418_8611585606066499815/-mr-10000 POSTHOOK: query: SELECT * FROM table1 POSTHOOK: type: QUERY POSTHOOK: Input: default@table1 -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-06-07_038_1626206004888639/-mr-10000 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-12_16-00-25_418_8611585606066499815/-mr-10000 POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] @@ -101,11 +245,11 @@ PREHOOK: query: SELECT * FROM table2 PREHOOK: type: QUERY PREHOOK: Input: default@table2 -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-06-07_139_9055053700650128611/-mr-10000 +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-12_16-00-25_571_507363775203542892/-mr-10000 POSTHOOK: query: SELECT * FROM table2 POSTHOOK: type: QUERY POSTHOOK: Input: default@table2 -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-06-07_139_9055053700650128611/-mr-10000 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-12_16-00-25_571_507363775203542892/-mr-10000 POSTHOOK: Lineage: table1.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: table1.b SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] POSTHOOK: Lineage: table2.a SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]