diff --git itests/src/test/resources/testconfiguration.properties itests/src/test/resources/testconfiguration.properties index d6339f3ea7..b48f2f1e8f 100644 --- itests/src/test/resources/testconfiguration.properties +++ itests/src/test/resources/testconfiguration.properties @@ -3021,7 +3021,8 @@ minillaplocal.query.files=\ windowing_range_multiorder.q,\ windowing_streaming.q,\ windowing_udaf.q,\ - windowing_windowspec3.q + windowing_windowspec3.q,\ + show_json_format.q encrypted.query.files=encryption_join_unencrypted_tbl.q,\ encryption_insert_partition_static.q,\ diff --git ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java index a1611e3e81..00ddb1dae8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java @@ -35,6 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.ImmutableMap; + import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -130,48 +132,38 @@ public void showTables(DataOutputStream out, List tables) * Show a list of tables including table types. */ @Override - public void showTablesExtended(DataOutputStream out, List tables) - throws HiveException { + public void showTablesExtended(DataOutputStream out, List
tables) throws HiveException { if (tables.isEmpty()) { - // Nothing to do return; } - MapBuilder builder = MapBuilder.create(); - ArrayList> res = new ArrayList>(); + List> tableDataList = new ArrayList>(); for (Table table : tables) { - final String tableName = table.getTableName(); - final String tableType = table.getTableType().toString(); - res.add(builder - .put("Table Name", tableName) - .put("Table Type", tableType) - .build()); + Map tableData = ImmutableMap.of( + "Table Name", table.getTableName(), + "Table Type", table.getTableType().toString()); + tableDataList.add(tableData); } - asJson(out, builder.put("tables", res).build()); + asJson(out, ImmutableMap.of("tables", tableDataList)); } /** * Show a list of materialized views. */ @Override - public void showMaterializedViews(DataOutputStream out, List
materializedViews) - throws HiveException { + public void showMaterializedViews(DataOutputStream out, List
materializedViews) throws HiveException { if (materializedViews.isEmpty()) { - // Nothing to do return; } - MapBuilder builder = MapBuilder.create(); - ArrayList> res = new ArrayList>(); - for (Table mv : materializedViews) { - final String mvName = mv.getTableName(); - final String rewriteEnabled = mv.isRewriteEnabled() ? "Yes" : "No"; + List> materializedViewDataList = new ArrayList>(); + for (Table materializedView : materializedViews) { // Currently, we only support manual refresh // TODO: Update whenever we have other modes - final String refreshMode = "Manual refresh"; - final String timeWindowString = mv.getProperty(MATERIALIZED_VIEW_REWRITING_TIME_WINDOW); - final String mode; - if (!org.apache.commons.lang3.StringUtils.isEmpty(timeWindowString)) { + String refreshMode = "Manual refresh"; + String timeWindowString = materializedView.getProperty(MATERIALIZED_VIEW_REWRITING_TIME_WINDOW); + String mode; + if (!StringUtils.isEmpty(timeWindowString)) { long time = HiveConf.toTime(timeWindowString, HiveConf.getDefaultTimeUnit(HiveConf.ConfVars.HIVE_MATERIALIZED_VIEW_REWRITING_TIME_WINDOW), TimeUnit.MINUTES); @@ -185,13 +177,14 @@ public void showMaterializedViews(DataOutputStream out, List
materialized } else { mode = refreshMode; } - res.add(builder - .put("MV Name", mvName) - .put("Rewriting Enabled", rewriteEnabled) - .put("Mode", mode) - .build()); + + Map materializedViewData = ImmutableMap.of( + "MV Name", materializedView.getTableName(), + "Rewriting Enabled", materializedView.isRewriteEnabled() ? "Yes" : "No", + "Mode", mode); + materializedViewDataList.add(materializedViewData); } - asJson(out, builder.put("materialized views", res).build()); + asJson(out, ImmutableMap.of("materialized views", materializedViewDataList)); } /** diff --git ql/src/test/queries/clientpositive/show_json_format.q ql/src/test/queries/clientpositive/show_json_format.q new file mode 100644 index 0000000000..82a9e0dfa3 --- /dev/null +++ ql/src/test/queries/clientpositive/show_json_format.q @@ -0,0 +1,25 @@ +--! qt:dataset::ONLY + +SET hive.ddl.output.format=json; +SET hive.cli.errors.ignore=true; +SET hive.test.authz.sstd.hs2.mode=true; + +SHOW DATABASES; +DESC DATABASE default; + +CREATE TABLE t (i int); +SHOW TABLES; +SHOW EXTENDED TABLES; +SHOW TABLE EXTENDED LIKE 't'; +DESC t; + +CREATE VIEW v AS SELECT * FROM t; +SHOW VIEWS; + +CREATE MATERIALIZED VIEW mv DISABLE REWRITE AS SELECT * FROM t; +SHOW MATERIALIZED VIEWS; + +CREATE RESOURCE PLAN rp; +SHOW RESOURCE PLANS; +SHOW RESOURCE PLAN rp; +ALTER RESOURCE PLAN rp VALIDATE; diff --git ql/src/test/results/clientpositive/llap/show_json_format.q.out ql/src/test/results/clientpositive/llap/show_json_format.q.out new file mode 100644 index 0000000000..b038a1d3ff --- /dev/null +++ ql/src/test/results/clientpositive/llap/show_json_format.q.out @@ -0,0 +1,100 @@ +PREHOOK: query: SHOW DATABASES +PREHOOK: type: SHOWDATABASES +POSTHOOK: query: SHOW DATABASES +POSTHOOK: type: SHOWDATABASES +{"databases":["default"]} +PREHOOK: query: DESC DATABASE default +PREHOOK: type: DESCDATABASE +PREHOOK: Input: database:default +POSTHOOK: query: DESC DATABASE default +POSTHOOK: type: DESCDATABASE +POSTHOOK: Input: database:default +#### A masked pattern was here #### +PREHOOK: query: CREATE TABLE t (i int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t +POSTHOOK: query: CREATE TABLE t (i int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t +PREHOOK: query: SHOW TABLES +PREHOOK: type: SHOWTABLES +PREHOOK: Input: database:default +POSTHOOK: query: SHOW TABLES +POSTHOOK: type: SHOWTABLES +POSTHOOK: Input: database:default +{"tables":["t"]} +PREHOOK: query: SHOW EXTENDED TABLES +PREHOOK: type: SHOWTABLES +PREHOOK: Input: database:default +POSTHOOK: query: SHOW EXTENDED TABLES +POSTHOOK: type: SHOWTABLES +POSTHOOK: Input: database:default +{"tables":[{"Table Name":"t","Table Type":"MANAGED_TABLE"}]} +PREHOOK: query: SHOW TABLE EXTENDED LIKE 't' +PREHOOK: type: SHOW_TABLESTATUS +POSTHOOK: query: SHOW TABLE EXTENDED LIKE 't' +POSTHOOK: type: SHOW_TABLESTATUS +#### A masked pattern was here #### +PREHOOK: query: DESC t +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@t +POSTHOOK: query: DESC t +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@t +{"columns":[{"name":"i","type":"int"}]} +PREHOOK: query: CREATE VIEW v AS SELECT * FROM t +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@t +PREHOOK: Output: database:default +PREHOOK: Output: default@v +POSTHOOK: query: CREATE VIEW v AS SELECT * FROM t +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@t +POSTHOOK: Output: database:default +POSTHOOK: Output: default@v +POSTHOOK: Lineage: v.i SIMPLE [(t)t.FieldSchema(name:i, type:int, comment:null), ] +PREHOOK: query: SHOW VIEWS +PREHOOK: type: SHOWVIEWS +POSTHOOK: query: SHOW VIEWS +POSTHOOK: type: SHOWVIEWS +{"tables":["v"]} +PREHOOK: query: CREATE MATERIALIZED VIEW mv DISABLE REWRITE AS SELECT * FROM t +PREHOOK: type: CREATE_MATERIALIZED_VIEW +PREHOOK: Input: default@t +PREHOOK: Output: database:default +PREHOOK: Output: default@mv +POSTHOOK: query: CREATE MATERIALIZED VIEW mv DISABLE REWRITE AS SELECT * FROM t +POSTHOOK: type: CREATE_MATERIALIZED_VIEW +POSTHOOK: Input: default@t +POSTHOOK: Output: database:default +POSTHOOK: Output: default@mv +PREHOOK: query: SHOW MATERIALIZED VIEWS +PREHOOK: type: SHOWMATERIALIZEDVIEWS +POSTHOOK: query: SHOW MATERIALIZED VIEWS +POSTHOOK: type: SHOWMATERIALIZEDVIEWS +{"materialized views":[{"MV Name":"mv","Rewriting Enabled":"No","Mode":"Manual refresh"}]} +PREHOOK: query: CREATE RESOURCE PLAN rp +PREHOOK: type: CREATE RESOURCEPLAN +PREHOOK: Output: dummyHostnameForTest +POSTHOOK: query: CREATE RESOURCE PLAN rp +POSTHOOK: type: CREATE RESOURCEPLAN +PREHOOK: query: SHOW RESOURCE PLANS +PREHOOK: type: SHOW RESOURCEPLAN +PREHOOK: Output: dummyHostnameForTest +POSTHOOK: query: SHOW RESOURCE PLANS +POSTHOOK: type: SHOW RESOURCEPLAN +[{"name":"rp","status":"DISABLED","defaultPoolPath":"default"}] +PREHOOK: query: SHOW RESOURCE PLAN rp +PREHOOK: type: SHOW RESOURCEPLAN +PREHOOK: Output: dummyHostnameForTest +POSTHOOK: query: SHOW RESOURCE PLAN rp +POSTHOOK: type: SHOW RESOURCEPLAN +{"name":"rp","status":"DISABLED","parallelism":null,"defaultPool":"default","pools":[{"name":"default","allocFraction":1.0,"schedulingPolicy":null,"parallelism":4,"triggers":[],"mappings":[{"type":"default","values":[]}],"pools":[]}]} +PREHOOK: query: ALTER RESOURCE PLAN rp VALIDATE +PREHOOK: type: ALTER RESOURCEPLAN +PREHOOK: Output: dummyHostnameForTest +POSTHOOK: query: ALTER RESOURCE PLAN rp VALIDATE +POSTHOOK: type: ALTER RESOURCEPLAN +{"errors":[],"warnings":[]}