You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by mg...@apache.org on 2020/05/22 23:33:42 UTC

[hive] branch master updated: HIVE-23513 Fix Json output for SHOW TABLES and SHOW MATERIALIZED VIEWS (Miklos Gergely, reviewed by Zoltan Haindrich)

This is an automated email from the ASF dual-hosted git repository.

mgergely pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new c641497  HIVE-23513 Fix Json output for SHOW TABLES and SHOW MATERIALIZED VIEWS (Miklos Gergely, reviewed by Zoltan Haindrich)
c641497 is described below

commit c64149747826e305dd5f9156ee9e6e8cf0c1e863
Author: miklosgergely <mg...@cloudera.com>
AuthorDate: Tue May 19 22:14:27 2020 +0200

    HIVE-23513 Fix Json output for SHOW TABLES and SHOW MATERIALIZED VIEWS (Miklos Gergely, reviewed by Zoltan Haindrich)
---
 .../test/resources/testconfiguration.properties    |   3 +-
 .../metadata/formatting/JsonMetaDataFormatter.java |  53 +++++------
 .../test/queries/clientpositive/show_json_format.q |  25 ++++++
 .../clientpositive/llap/show_json_format.q.out     | 100 +++++++++++++++++++++
 4 files changed, 150 insertions(+), 31 deletions(-)

diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index 0d06d02..38a8103 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -3025,7 +3025,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 a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
index a1611e3..00ddb1d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
@@ -35,6 +35,8 @@ import org.apache.commons.lang3.StringUtils;
 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 class JsonMetaDataFormatter implements MetaDataFormatter {
    * Show a list of tables including table types.
    */
   @Override
-  public void showTablesExtended(DataOutputStream out, List<Table> tables)
-      throws HiveException {
+  public void showTablesExtended(DataOutputStream out, List<Table> tables) throws HiveException {
     if (tables.isEmpty()) {
-      // Nothing to do
       return;
     }
 
-    MapBuilder builder = MapBuilder.create();
-    ArrayList<Map<String, Object>> res = new ArrayList<Map<String, Object>>();
+    List<Map<String, Object>> tableDataList = new ArrayList<Map<String, Object>>();
     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<String, Object> 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<Table> materializedViews)
-      throws HiveException {
+  public void showMaterializedViews(DataOutputStream out, List<Table> materializedViews) throws HiveException {
     if (materializedViews.isEmpty()) {
-      // Nothing to do
       return;
     }
 
-    MapBuilder builder = MapBuilder.create();
-    ArrayList<Map<String, Object>> res = new ArrayList<Map<String, Object>>();
-    for (Table mv : materializedViews) {
-      final String mvName = mv.getTableName();
-      final String rewriteEnabled = mv.isRewriteEnabled() ? "Yes" : "No";
+    List<Map<String, Object>> materializedViewDataList = new ArrayList<Map<String, Object>>();
+    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 class JsonMetaDataFormatter implements MetaDataFormatter {
       } else {
         mode = refreshMode;
       }
-      res.add(builder
-          .put("MV Name", mvName)
-          .put("Rewriting Enabled", rewriteEnabled)
-          .put("Mode", mode)
-          .build());
+
+      Map<String, Object> 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 a/ql/src/test/queries/clientpositive/show_json_format.q b/ql/src/test/queries/clientpositive/show_json_format.q
new file mode 100644
index 0000000..82a9e0d
--- /dev/null
+++ b/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 a/ql/src/test/results/clientpositive/llap/show_json_format.q.out b/ql/src/test/results/clientpositive/llap/show_json_format.q.out
new file mode 100644
index 0000000..b038a1d
--- /dev/null
+++ b/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":[]}