Index: conf/hive-default.xml.template =================================================================== --- conf/hive-default.xml.template (revision 1431908) +++ conf/hive-default.xml.template (working copy) @@ -71,6 +71,14 @@ + hive.cli.pretty.output.num.cols + -1 + The number of columns to use when formatting output generated + by the DESCRIBE PRETTY table_name command. If the value of this property + is -1, then hive will use the auto-detected terminal width. + + + hive.exec.scratchdir /tmp/hive-${user.name} Scratch space for Hive jobs Index: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java =================================================================== --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (revision 1431908) +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (working copy) @@ -351,6 +351,7 @@ CLIIGNOREERRORS("hive.cli.errors.ignore", false), CLIPRINTCURRENTDB("hive.cli.print.current.db", false), CLIPROMPT("hive.cli.prompt", "hive"), + CLIPRETTYOUTPUTNUMCOLS("hive.cli.pretty.output.num.cols", -1), HIVE_METASTORE_FS_HANDLER_CLS("hive.metastore.fs.handler.class", "org.apache.hadoop.hive.metastore.HiveMetaStoreFsImpl"), Index: ql/ivy.xml =================================================================== --- ql/ivy.xml (revision 1431908) +++ ql/ivy.xml (working copy) @@ -79,6 +79,8 @@ transitive="false"/> + + Index: ql/src/test/results/clientpositive/describe_pretty.q.out =================================================================== --- ql/src/test/results/clientpositive/describe_pretty.q.out (revision 0) +++ ql/src/test/results/clientpositive/describe_pretty.q.out (revision 0) @@ -0,0 +1,200 @@ +PREHOOK: query: -- test comment indent processing for multi-line comments + +CREATE TABLE test_table( + col1 INT COMMENT 'col1 one line comment', + col2 STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines', + col5 STRING COMMENT 'col5 very long multi-line comment where each line is very long by itself and is likely to spill +into multiple lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in dolor nisl, sodales +adipiscing tortor. Integer venenatis', + col6 STRING COMMENT 'This comment has a very long single word ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvzxyz123 which will not fit in a line by itself for small column widths.', + col7_NoComment STRING) +COMMENT 'table comment +two lines' +PREHOOK: type: CREATETABLE +POSTHOOK: query: -- test comment indent processing for multi-line comments + +CREATE TABLE test_table( + col1 INT COMMENT 'col1 one line comment', + col2 STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines', + col5 STRING COMMENT 'col5 very long multi-line comment where each line is very long by itself and is likely to spill +into multiple lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in dolor nisl, sodales +adipiscing tortor. Integer venenatis', + col6 STRING COMMENT 'This comment has a very long single word ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvzxyz123 which will not fit in a line by itself for small column widths.', + col7_NoComment STRING) +COMMENT 'table comment +two lines' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@test_table +PREHOOK: query: DESCRIBE PRETTY test_table +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE PRETTY test_table +POSTHOOK: type: DESCTABLE +col_name data_type comment + +col1 int col1 one line comment +col2 string col2 + two lines comment +col3 string col3 + three lines + comment +col4 string col4 very long comment that is greater than 80 + chars and is likely to spill into multiple + lines +col5 string col5 very long multi-line comment where each + line is very long by itself and is likely to + spill + into multiple lines. Lorem ipsum dolor sit + amet, consectetur adipiscing elit. Proin in + dolor nisl, sodales + adipiscing tortor. Integer venenatis +col6 string This comment has a very long single word ABCDEF + GHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvzxyz12 + 3 which will not fit in a line by itself for + small column widths. +col7_nocomment string None +PREHOOK: query: DESCRIBE PRETTY test_table +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE PRETTY test_table +POSTHOOK: type: DESCTABLE +col_name data_type comment + +col1 int col1 one line comment +col2 string col2 + two lines comment +col3 string col3 + three lines + comment +col4 string col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines +col5 string col5 very long multi-line comment where each line is very long by itself and is likely to spill + into multiple lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in dolor nisl, sodales + adipiscing tortor. Integer venenatis +col6 string This comment has a very long single word ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvzxyz123 which will not fit in a line by itself for small column widths. +col7_nocomment string None +PREHOOK: query: DESCRIBE PRETTY test_table +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE PRETTY test_table +POSTHOOK: type: DESCTABLE +col_name data_type comment + +col1 int col1 one line + comment +col2 string col2 + two lines comment +col3 string col3 + three lines + comment +col4 string col4 very long + comment that is + greater than 80 + chars and is + likely to spill + into multiple + lines +col5 string col5 very long + multi-line + comment where + each line is very + long by itself + and is likely to + spill + into multiple + lines. Lorem + ipsum dolor sit + amet, consectetur + adipiscing elit. + Proin in dolor + nisl, sodales + adipiscing + tortor. Integer + venenatis +col6 string This comment has + a very long + single word ABCDE + FGHIJKLMNOPQRSTUV + XYZabcdefghijklmn + opqrstuvzxyz123 + which will not + fit in a line by + itself for small + column widths. +col7_nocomment string None +PREHOOK: query: DESCRIBE PRETTY test_table +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE PRETTY test_table +POSTHOOK: type: DESCTABLE +col_name data_type comment + +col1 int col1 one line comment +col2 string col2 + two lines comment +col3 string col3 + three lines + comment +col4 string col4 very long comment that + is greater than 80 chars + and is likely to spill into + multiple lines +col5 string col5 very long multi-line + comment where each line is + very long by itself and is + likely to spill + into multiple lines. Lorem + ipsum dolor sit amet, + consectetur adipiscing + elit. Proin in dolor nisl, + sodales + adipiscing tortor. Integer + venenatis +col6 string This comment has a very + long single word ABCDEFGHIJ + KLMNOPQRSTUVXYZabcdefghijkl + mnopqrstuvzxyz123 which + will not fit in a line by + itself for small column + widths. +col7_nocomment string None +PREHOOK: query: CREATE TABLE test_table_very_long_column_name( + col1 INT COMMENT 'col1 one line comment', + col2_abcdefghiklmnopqrstuvxyz STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines') +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE test_table_very_long_column_name( + col1 INT COMMENT 'col1 one line comment', + col2_abcdefghiklmnopqrstuvxyz STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines') +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@test_table_very_long_column_name +PREHOOK: query: DESCRIBE PRETTY test_table_very_long_column_name +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE PRETTY test_table_very_long_column_name +POSTHOOK: type: DESCTABLE +col_name data_type comment + +col1 int col1 one line comment +col2_abcdefghiklmnopqrstuvxyz string col2 + two lines comment +col3 string col3 + three lines + comment +col4 string col4 very long comment that is + greater than 80 chars and is + likely to spill into multiple + lines Index: ql/src/test/queries/clientpositive/describe_pretty.q =================================================================== --- ql/src/test/queries/clientpositive/describe_pretty.q (revision 0) +++ ql/src/test/queries/clientpositive/describe_pretty.q (revision 0) @@ -0,0 +1,42 @@ +-- test comment indent processing for multi-line comments + +CREATE TABLE test_table( + col1 INT COMMENT 'col1 one line comment', + col2 STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines', + col5 STRING COMMENT 'col5 very long multi-line comment where each line is very long by itself and is likely to spill +into multiple lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in dolor nisl, sodales +adipiscing tortor. Integer venenatis', + col6 STRING COMMENT 'This comment has a very long single word ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvzxyz123 which will not fit in a line by itself for small column widths.', + col7_NoComment STRING) +COMMENT 'table comment +two lines'; + +SET hive.cli.pretty.output.num.cols=80; +DESCRIBE PRETTY test_table; + +SET hive.cli.pretty.output.num.cols=200; +DESCRIBE PRETTY test_table; + +SET hive.cli.pretty.output.num.cols=50; +DESCRIBE PRETTY test_table; + +SET hive.cli.pretty.output.num.cols=60; +DESCRIBE PRETTY test_table; + +CREATE TABLE test_table_very_long_column_name( + col1 INT COMMENT 'col1 one line comment', + col2_abcdefghiklmnopqrstuvxyz STRING COMMENT 'col2 +two lines comment', + col3 STRING COMMENT 'col3 +three lines +comment', + col4 STRING COMMENT 'col4 very long comment that is greater than 80 chars and is likely to spill into multiple lines') +; + +SET hive.cli.pretty.output.num.cols=80; +DESCRIBE PRETTY test_table_very_long_column_name; Index: ql/src/java/org/apache/hadoop/hive/ql/plan/DescTableDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/DescTableDesc.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/DescTableDesc.java (working copy) @@ -42,6 +42,12 @@ String colPath; boolean isExt; boolean isFormatted; + + /** Show pretty output? This has more human-readable formatting than + * isFormatted mode. + */ + private boolean isPretty; + /** * table name for the result of describe table. */ @@ -63,6 +69,7 @@ Map partSpec, String colPath) { this.isExt = false; this.isFormatted = false; + this.isPretty = false; this.partSpec = partSpec; this.resFile = resFile.toString(); this.tableName = tableName; @@ -92,7 +99,7 @@ this.isExt = isExt; } - /** + /** * @return the isFormatted */ public boolean isFormatted() { @@ -107,6 +114,14 @@ this.isFormatted = isFormat; } + public boolean isPretty() { + return this.isPretty; + } + + public void setPretty(boolean isPretty) { + this.isPretty = isPretty; + } + /** * @return the tableName */ Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -943,7 +943,7 @@ descStatement @init { msgs.push("describe statement"); } @after { msgs.pop(); } - : (KW_DESCRIBE|KW_DESC) (descOptions=KW_FORMATTED|descOptions=KW_EXTENDED)? (parttype=descPartTypeExpr) -> ^(TOK_DESCTABLE $parttype $descOptions?) + : (KW_DESCRIBE|KW_DESC) (descOptions=KW_FORMATTED|descOptions=KW_EXTENDED|descOptions=KW_PRETTY)? (parttype=descPartTypeExpr) -> ^(TOK_DESCTABLE $parttype $descOptions?) | (KW_DESCRIBE|KW_DESC) KW_FUNCTION KW_EXTENDED? (name=descFuncNames) -> ^(TOK_DESCFUNCTION $name KW_EXTENDED?) | (KW_DESCRIBE|KW_DESC) KW_DATABASE KW_EXTENDED? (dbName=Identifier) -> ^(TOK_DESCDATABASE $dbName KW_EXTENDED?) ; @@ -2516,6 +2516,7 @@ KW_EXPLAIN: 'EXPLAIN'; KW_EXTENDED: 'EXTENDED'; KW_FORMATTED: 'FORMATTED'; +KW_PRETTY: 'PRETTY'; KW_DEPENDENCY: 'DEPENDENCY'; KW_SERDE: 'SERDE'; KW_WITH: 'WITH'; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (working copy) @@ -1736,6 +1736,7 @@ int descOptions = ast.getChild(1).getType(); descTblDesc.setFormatted(descOptions == HiveParser.KW_FORMATTED); descTblDesc.setExt(descOptions == HiveParser.KW_EXTENDED); + descTblDesc.setPretty(descOptions == HiveParser.KW_PRETTY); } rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), descTblDesc), conf)); Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataPrettyFormatUtils.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataPrettyFormatUtils.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataPrettyFormatUtils.java (revision 0) @@ -0,0 +1,215 @@ +package org.apache.hadoop.hive.ql.metadata.formatting; + +import java.util.List; +import java.util.StringTokenizer; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.hadoop.hive.metastore.api.FieldSchema; + +import jline.Terminal; + +/** + * This class provides methods to format the output of DESCRIBE PRETTY + * in a human-readable way. + */ +public final class MetaDataPrettyFormatUtils { + + public static final int PRETTY_MAX_INTERCOL_SPACING = 4; + private static final int PRETTY_ALIGNMENT = 10; + + private MetaDataPrettyFormatUtils() { + } + + /** + * @param prettyOutputNumCols The pretty output is formatted to fit within + * these many columns. + */ + public static String getAllColumnsInformation(List cols, + List partCols, int prettyOutputNumCols) { + StringBuilder columnInformation = new StringBuilder( + MetaDataFormatUtils.DEFAULT_STRINGBUILDER_SIZE); + int maxColNameLen = findMaxColumnNameLen(cols); + formatColumnsHeaderPretty(columnInformation, maxColNameLen, prettyOutputNumCols); + formatAllFieldsPretty(columnInformation, cols, maxColNameLen, prettyOutputNumCols); + + if ((partCols != null) && (!partCols.isEmpty())) { + columnInformation.append(MetaDataFormatUtils.LINE_DELIM) + .append("# Partition Information") + .append(MetaDataFormatUtils.LINE_DELIM); + formatColumnsHeaderPretty(columnInformation, maxColNameLen, prettyOutputNumCols); + formatAllFieldsPretty(columnInformation, partCols, maxColNameLen, prettyOutputNumCols); + } + + return columnInformation.toString(); + } + + /** + * Find the length of the largest column name. + */ + private static int findMaxColumnNameLen(List cols) { + int maxLen = -1; + for (FieldSchema col : cols) { + int colNameLen = col.getName().length(); + if (colNameLen > maxLen) { + maxLen = colNameLen; + } + } + return maxLen; + } + + /** + * @param maxColNameLen The length of the largest column name + */ + private static void formatColumnsHeaderPretty(StringBuilder columnInformation, + int maxColNameLen, int prettyOutputNumCols) { + String columnHeaders[] = MetaDataFormatUtils.getColumnsHeader(); + formatOutputPretty(columnHeaders[0], columnHeaders[1], columnHeaders[2], + columnInformation, maxColNameLen, prettyOutputNumCols); + columnInformation.append(MetaDataFormatUtils.LINE_DELIM); + } + + private static void formatAllFieldsPretty(StringBuilder tableInfo, + List cols, int maxColNameLen, int prettyOutputNumCols) { + for (FieldSchema col : cols) { + formatFieldSchemasPretty(tableInfo, col, maxColNameLen, prettyOutputNumCols); + } + } + + private static void formatFieldSchemasPretty(StringBuilder tableInfo, + FieldSchema col, int maxColNameLength, int prettyOutputNumCols) { + String comment = col.getComment() != null ? col.getComment() : "None"; + formatOutputPretty(col.getName(), col.getType(), comment, + tableInfo, maxColNameLength, prettyOutputNumCols); + } + + /** + * If the specified comment is too long, add line breaks at appropriate + * locations. Note that the comment may already include line-breaks + * specified by the user at table creation time. + * @param columnsAlreadyConsumed The number of columns on the current line + * that have already been consumed by the column name, column type and + * and the surrounding delimiters. + * @return The comment with line breaks added at appropriate locations. + */ + private static String breakCommentIntoMultipleLines(String comment, + int columnsAlreadyConsumed, int prettyOutputNumCols) { + + if (prettyOutputNumCols == -1) { + Terminal terminal = Terminal.getTerminal(); + prettyOutputNumCols = terminal.getTerminalWidth() - 1; + } + + final int commentNumCols = prettyOutputNumCols - columnsAlreadyConsumed; + + // Track the number of columns allocated for the comment that have + // already been consumed on the current line. + int commentNumColsConsumed = 0; + + StringTokenizer st = new StringTokenizer(comment, " \t\n\r\f", true); + // We use a StringTokenizer instead of a BreakIterator, because + // table comments often contain text that looks like code. For eg: + // 'Type0' => 0, // This is Type 0 + // 'Type1' => 1, // This is Type 1 + // BreakIterator is meant for regular text, and was found to give + // bad line breaks when we tried it out. + + StringBuilder commentBuilder = new StringBuilder(comment.length()); + while (st.hasMoreTokens()) { + String currWord = st.nextToken(); + if (currWord.equals("\n") || currWord.equals("\r") || currWord.equals("\f")) { + commentBuilder.append(currWord); + commentNumColsConsumed = 0; + continue; + } + if (commentNumColsConsumed + currWord.length() > commentNumCols) { + // currWord won't fit on the current line + if (currWord.length() > commentNumCols) { + // currWord is too long to split on a line even all by itself. + // Hence we have no option but to split it. The first chunk + // will go to the end of the current line. Subsequent chunks + // will be of length commentNumCols. The last chunk + // may be smaller. + while (currWord.length() > commentNumCols) { + int remainingLineLen = commentNumCols - commentNumColsConsumed; + String wordChunk = currWord.substring(0, remainingLineLen); + commentBuilder.append(wordChunk); + commentBuilder.append(MetaDataFormatUtils.LINE_DELIM); + commentNumColsConsumed = 0; + currWord = currWord.substring(remainingLineLen); + } + // Handle the last chunk + if (currWord.length() > 0) { + commentBuilder.append(currWord); + commentNumColsConsumed = currWord.length(); + } + } else { + // Start on a new line + commentBuilder.append(MetaDataFormatUtils.LINE_DELIM); + if (!currWord.equals(" ")) { + // When starting a new line, do not start with a space. + commentBuilder.append(currWord); + commentNumColsConsumed = currWord.length(); + } else { + commentNumColsConsumed = 0; + } + } + } else { + commentBuilder.append(currWord); + commentNumColsConsumed += currWord.length(); + } + } + return commentBuilder.toString(); + } + + /** + * Appends the specified text with alignment to sb. + * Also appends an appopriately sized delimiter. + * @return The number of columns consumed by the aligned string and the + * delimiter. + */ + private static int appendFormattedColumn(StringBuilder sb, String text, + int alignment) { + String paddedText = String.format("%-" + alignment + "s", text); + int delimCount = 0; + if (paddedText.length() < alignment + PRETTY_MAX_INTERCOL_SPACING) { + delimCount = (alignment + PRETTY_MAX_INTERCOL_SPACING) + - paddedText.length(); + } else { + delimCount = PRETTY_MAX_INTERCOL_SPACING; + } + String delim = StringUtils.repeat(" ", delimCount); + sb.append(paddedText); + sb.append(delim); + + return paddedText.length() + delim.length(); + } + + private static void formatOutputPretty(String colName, String colType, + String colComment, StringBuilder tableInfo, int maxColNameLength, + int prettyOutputNumCols) { + int colsConsumed = 0; + colsConsumed += appendFormattedColumn(tableInfo, colName, maxColNameLength + 1); + colsConsumed += appendFormattedColumn(tableInfo, colType, PRETTY_ALIGNMENT); + + colComment = breakCommentIntoMultipleLines(colComment, colsConsumed, prettyOutputNumCols); + + /* Comment indent processing for multi-line comments. + * Comments should be indented the same amount on each line + * if the first line comment starts indented by k, + * the following line comments should also be indented by k. + */ + String[] commentSegments = colComment.split("\n|\r|\r\n"); + tableInfo.append(trimTrailingWS(commentSegments[0])); + tableInfo.append(MetaDataFormatUtils.LINE_DELIM); + for (int i = 1; i < commentSegments.length; i++) { + tableInfo.append(StringUtils.repeat(" ", colsConsumed)); + tableInfo.append(trimTrailingWS(commentSegments[i])); + tableInfo.append(MetaDataFormatUtils.LINE_DELIM); + } + } + + private static String trimTrailingWS(String str) { + return str.replaceAll("\\s+$", ""); + } +} Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java (working copy) @@ -94,7 +94,7 @@ public void describeTable(DataOutputStream out, String colPath, String tableName, Table tbl, Partition part, List cols, - boolean isFormatted, boolean isExt) + boolean isFormatted, boolean isExt, boolean isPretty) throws HiveException; /** Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java (working copy) @@ -54,6 +54,15 @@ private static final int separator = Utilities.tabCode; private static final int terminator = Utilities.newLineCode; + /** The number of columns to be used in pretty formatting metadata output. + * If -1, then the current terminal width is auto-detected and used. + */ + private final int prettyOutputNumCols; + + public TextMetaDataFormatter(int prettyOutputNumCols) { + this.prettyOutputNumCols = prettyOutputNumCols; + } + /** * Write an error message. */ @@ -124,13 +133,18 @@ public void describeTable(DataOutputStream outStream, String colPath, String tableName, Table tbl, Partition part, List cols, - boolean isFormatted, boolean isExt) + boolean isFormatted, boolean isExt, boolean isPretty) throws HiveException { try { if (colPath.equals(tableName)) { + List partCols = tbl.isPartitioned() ? tbl.getPartCols() : null; outStream.writeBytes( - MetaDataFormatUtils.getAllColumnsInformation( - cols, tbl.isPartitioned() ? tbl.getPartCols() : null)); + isPretty ? + MetaDataPrettyFormatUtils.getAllColumnsInformation( + cols, partCols, prettyOutputNumCols) + : + MetaDataFormatUtils.getAllColumnsInformation(cols, partCols) + ); } else { outStream.writeBytes(MetaDataFormatUtils.getAllColumnsInformation(cols)); } Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatUtils.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatUtils.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatUtils.java (working copy) @@ -50,7 +50,7 @@ public static final String FIELD_DELIM = "\t"; public static final String LINE_DELIM = "\n"; - private static final int DEFAULT_STRINGBUILDER_SIZE = 2048; + static final int DEFAULT_STRINGBUILDER_SIZE = 2048; private static final int ALIGNMENT = 20; private MetaDataFormatUtils() { Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java (working copy) @@ -145,7 +145,8 @@ public void describeTable(DataOutputStream out, String colPath, String tableName, Table tbl, Partition part, List cols, - boolean isFormatted, boolean isExt) + boolean isFormatted, boolean isExt, + boolean isPretty) throws HiveException { MapBuilder builder = MapBuilder.create(); Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1431908) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -205,7 +205,8 @@ HiveConf.ConfVars.HIVE_DDL_OUTPUT_FORMAT.varname, "text"))) { formatter = new JsonMetaDataFormatter(); } else { - formatter = new TextMetaDataFormatter(); + formatter = new TextMetaDataFormatter( + conf.getIntVar(HiveConf.ConfVars.CLIPRETTYOUTPUTNUMCOLS)); } INTERMEDIATE_ARCHIVED_DIR_SUFFIX = @@ -2853,7 +2854,7 @@ } formatter.describeTable(outStream, colPath, tableName, tbl, part, cols, - descTbl.isFormatted(), descTbl.isExt()); + descTbl.isFormatted(), descTbl.isExt(), descTbl.isPretty()); LOG.info("DDLTask: written data for " + tbl.getTableName()); ((FSDataOutputStream) outStream).close();