You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sa...@apache.org on 2019/06/03 20:20:37 UTC
[atlas] branch master updated: ATLAS-3226: Add QueryText for
hive_table and hive_db for Impala integration
This is an automated email from the ASF dual-hosted git repository.
sarath pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push:
new 2f461b4 ATLAS-3226: Add QueryText for hive_table and hive_db for Impala integration
2f461b4 is described below
commit 2f461b4217df7e1f6fcded17c83fc9ff7670a6d5
Author: lina.li <li...@cloudera.com>
AuthorDate: Mon Jun 3 13:20:10 2019 -0700
ATLAS-3226: Add QueryText for hive_table and hive_db for Impala integration
Signed-off-by: Sarath Subramanian <sa...@apache.org>
---
.../atlas/hive/hook/events/BaseHiveEvent.java | 2 +
.../atlas/impala/hook/events/BaseImpalaEvent.java | 55 +++++++++++++++++++--
.../impala/hook/events/CreateImpalaProcess.java | 7 +++
.../apache/atlas/impala/model/ImpalaDataType.java | 4 +-
.../apache/atlas/impala/ImpalaLineageITBase.java | 27 +++++++++++
.../apache/atlas/impala/ImpalaLineageToolIT.java | 56 ++++++++++++++++++++--
.../atlas/impala/hook/ImpalaLineageHookIT.java | 17 +++++--
addons/models/0000-Area0/0010-base_model.json | 42 ++++++++++++++++
addons/models/1000-Hadoop/1030-hive_model.json | 38 +--------------
9 files changed, 197 insertions(+), 51 deletions(-)
diff --git a/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/BaseHiveEvent.java b/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/BaseHiveEvent.java
index 7b4b893..b7033ba 100644
--- a/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/BaseHiveEvent.java
+++ b/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/BaseHiveEvent.java
@@ -148,6 +148,7 @@ public abstract class BaseHiveEvent {
public static final String ATTRIBUTE_HOSTNAME = "hostName";
public static final String ATTRIBUTE_EXEC_TIME = "execTime";
public static final String ATTRIBUTE_DDL_QUERIES = "ddlQueries";
+ public static final String ATTRIBUTE_SERVICE_TYPE = "serviceType";
public static final String HBASE_STORAGE_HANDLER_CLASS = "org.apache.hadoop.hive.hbase.HBaseStorageHandler";
public static final String HBASE_DEFAULT_NAMESPACE = "default";
@@ -688,6 +689,7 @@ public abstract class BaseHiveEvent {
}
if (hiveDDL != null) {
+ hiveDDL.setAttribute(ATTRIBUTE_SERVICE_TYPE, "hive");
hiveDDL.setAttribute(ATTRIBUTE_EXEC_TIME, getQueryStartTime());
hiveDDL.setAttribute(ATTRIBUTE_QUERY_TEXT, getQueryString());
hiveDDL.setAttribute(ATTRIBUTE_USER_NAME, getUserName());
diff --git a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/BaseImpalaEvent.java b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/BaseImpalaEvent.java
index d241b6a..d437ba2 100644
--- a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/BaseImpalaEvent.java
+++ b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/BaseImpalaEvent.java
@@ -47,6 +47,7 @@ import org.apache.atlas.model.notification.HookNotification;
import org.apache.atlas.type.AtlasTypeUtil;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -88,11 +89,11 @@ public abstract class BaseImpalaEvent {
public static final String ATTRIBUTE_DEPENDENCY_TYPE = "dependencyType";
public static final String ATTRIBUTE_HOSTNAME = "hostName";
public static final String EMPTY_ATTRIBUTE_VALUE = "";
-
+ public static final String ATTRIBUTE_EXEC_TIME = "execTime";
+ public static final String ATTRIBUTE_DDL_QUERIES = "ddlQueries";
+ public static final String ATTRIBUTE_SERVICE_TYPE = "serviceType";
public static final long MILLIS_CONVERT_FACTOR = 1000;
-
-
protected final AtlasImpalaHookContext context;
protected final Map<String, ImpalaNode> vertexNameMap;
protected final Map<Long, LineageVertex> verticesMap;
@@ -555,8 +556,8 @@ public abstract class BaseImpalaEvent {
queryStr = queryStr.toLowerCase().trim();
}
- Long startTime = context.getLineageQuery().getTimestamp() * BaseImpalaEvent.MILLIS_CONVERT_FACTOR;
- Long endTime = context.getLineageQuery().getEndTime() * BaseImpalaEvent.MILLIS_CONVERT_FACTOR;
+ Long startTime = getQueryStartTime();
+ Long endTime = getQueryEndTime();
ret.setAttribute(ATTRIBUTE_QUALIFIED_NAME, impalaProcess.getAttribute(ATTRIBUTE_QUALIFIED_NAME).toString() +
QNAME_SEP_PROCESS + startTime.toString() +
@@ -574,6 +575,14 @@ public abstract class BaseImpalaEvent {
return ret;
}
+ protected Long getQueryStartTime() {
+ return context.getLineageQuery().getTimestamp() * BaseImpalaEvent.MILLIS_CONVERT_FACTOR;
+ }
+
+ protected Long getQueryEndTime() {
+ return context.getLineageQuery().getEndTime() * BaseImpalaEvent.MILLIS_CONVERT_FACTOR;
+ }
+
protected void addProcessedEntities(AtlasEntitiesWithExtInfo entitiesWithExtInfo) {
for (AtlasEntity entity : context.getEntities()) {
entitiesWithExtInfo.addReferredEntity(entity);
@@ -614,4 +623,40 @@ public abstract class BaseImpalaEvent {
tableVertex.setCreateTime(createTime);
return new ImpalaNode(tableVertex);
}
+
+ protected AtlasEntity createHiveDDLEntity(AtlasEntity dbOrTable) {
+ return createHiveDDLEntity(dbOrTable, true);
+ }
+
+ protected AtlasEntity createHiveDDLEntity(AtlasEntity dbOrTable, boolean excludeEntityGuid) {
+ AtlasObjectId objId = BaseImpalaEvent.getObjectId(dbOrTable);
+ AtlasEntity hiveDDL = null;
+
+ if (excludeEntityGuid) {
+ objId.setGuid(null);
+ }
+
+ if (StringUtils.equals(objId.getTypeName(), HIVE_TYPE_DB)) {
+ hiveDDL = new AtlasEntity(ImpalaDataType.HIVE_DB_DDL.getName(), ATTRIBUTE_DB, objId);
+ } else if (StringUtils.equals(objId.getTypeName(), HIVE_TYPE_TABLE)) {
+ hiveDDL = new AtlasEntity(ImpalaDataType.HIVE_TABLE_DDL.getName(), ATTRIBUTE_TABLE, objId);
+ }
+
+ if (hiveDDL != null) {
+ hiveDDL.setAttribute(ATTRIBUTE_SERVICE_TYPE, "impala");
+ hiveDDL.setAttribute(ATTRIBUTE_EXEC_TIME, getQueryStartTime());
+ hiveDDL.setAttribute(ATTRIBUTE_QUERY_TEXT, context.getQueryStr());
+ hiveDDL.setAttribute(ATTRIBUTE_USER_NAME, getUserName());
+ hiveDDL.setAttribute(ATTRIBUTE_NAME, context.getQueryStr() + QNAME_SEP_PROCESS + getQueryStartTime().toString());
+ hiveDDL.setAttribute(ATTRIBUTE_QUALIFIED_NAME, hiveDDL.getAttribute(ATTRIBUTE_NAME));
+ }
+
+ return hiveDDL;
+ }
+
+ protected boolean isDdlOperation() {
+ return (context.getImpalaOperationType().equals(ImpalaOperationType.CREATEVIEW)
+ || context.getImpalaOperationType().equals(ImpalaOperationType.ALTERVIEW_AS)
+ || context.getImpalaOperationType().equals(ImpalaOperationType.CREATETABLE_AS_SELECT));
+ }
}
diff --git a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/CreateImpalaProcess.java b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/CreateImpalaProcess.java
index b7506a4..5e6ea5a 100644
--- a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/CreateImpalaProcess.java
+++ b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/hook/events/CreateImpalaProcess.java
@@ -104,6 +104,13 @@ public class CreateImpalaProcess extends BaseImpalaEvent {
if (entity != null) {
outputs.add(entity);
+
+ if (isDdlOperation()) {
+ AtlasEntity ddlEntity = createHiveDDLEntity(entity);
+ if (ddlEntity != null) {
+ ret.addEntity(ddlEntity);
+ }
+ }
}
}
}
diff --git a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/model/ImpalaDataType.java b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/model/ImpalaDataType.java
index 10ce448..4e0d478 100644
--- a/addons/impala-bridge/src/main/java/org/apache/atlas/impala/model/ImpalaDataType.java
+++ b/addons/impala-bridge/src/main/java/org/apache/atlas/impala/model/ImpalaDataType.java
@@ -24,7 +24,9 @@ public enum ImpalaDataType {
IMPALA_PROCESS,
IMPALA_PROCESS_EXECUTION,
- IMPALA_COLUMN_LINEAGE;
+ IMPALA_COLUMN_LINEAGE,
+ HIVE_DB_DDL,
+ HIVE_TABLE_DDL;
public String getName() {
return name().toLowerCase();
diff --git a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageITBase.java b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageITBase.java
index b8cbf6b..f1d0237 100644
--- a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageITBase.java
+++ b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageITBase.java
@@ -22,6 +22,7 @@ import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.ATTRIBUTE_QUAL
import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.ATTRIBUTE_QUERY_TEXT;
import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.ATTRIBUTE_RECENT_QUERIES;
import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.HIVE_TYPE_DB;
+import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.HIVE_TYPE_TABLE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.fail;
@@ -300,6 +301,32 @@ public class ImpalaLineageITBase {
return assertEntityIsRegistered(HIVE_TYPE_DB, REFERENCEABLE_ATTRIBUTE_NAME, dbQualifiedName, assertPredicate);
}
+ protected String assertTableIsRegistered(String dbName, String tableName) throws Exception {
+ return assertTableIsRegistered(dbName, tableName, null, false);
+ }
+
+ protected String assertTableIsRegistered(String fullTableName) throws Exception {
+ return assertTableIsRegistered(fullTableName, null, false);
+ }
+
+ protected String assertTableIsRegistered(String dbName, String tableName, AssertPredicate assertPredicate, boolean isTemporary) throws Exception {
+ LOG.debug("Searching for table {}.{}", dbName, tableName);
+
+ String fullTableName = dbName + AtlasImpalaHookContext.QNAME_SEP_ENTITY_NAME + tableName;
+
+ return assertTableIsRegistered(fullTableName, assertPredicate, isTemporary);
+ }
+
+ protected String assertTableIsRegistered(String fullTableName, AssertPredicate assertPredicate, boolean isTemporary) throws Exception {
+ LOG.debug("Searching for table {}", fullTableName);
+
+ String tableQualifiedName = (fullTableName + AtlasImpalaHookContext.QNAME_SEP_CLUSTER_NAME).toLowerCase() +
+ CLUSTER_NAME;
+
+ return assertEntityIsRegistered(HIVE_TYPE_TABLE, REFERENCEABLE_ATTRIBUTE_NAME, tableQualifiedName,
+ assertPredicate);
+ }
+
protected String createDatabase() throws Exception {
String dbName = dbName();
diff --git a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageToolIT.java b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageToolIT.java
index 7f9a534..6908191 100644
--- a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageToolIT.java
+++ b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/ImpalaLineageToolIT.java
@@ -30,6 +30,10 @@ import org.apache.atlas.model.instance.AtlasObjectId;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.ATTRIBUTE_DDL_QUERIES;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
public class ImpalaLineageToolIT extends ImpalaLineageITBase {
public static final long TABLE_CREATE_TIME_SOURCE = 1554750070;
public static final long TABLE_CREATE_TIME = 1554750072;
@@ -78,14 +82,20 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
processQFName = processQFName.toLowerCase();
- String queryString = "create view db_1.view_1 as select count, id from db_1.table_1";
- AtlasEntity processEntity1 = validateProcess(processQFName, queryString);
+ String queryString = "create view db_1.view_1 as select count, id from db_1.table_1";
+ AtlasEntity processEntity1 = validateProcess(processQFName, queryString);
AtlasEntity processExecutionEntity1 = validateProcessExecution(processEntity1, queryString);
- AtlasObjectId process1 = toAtlasObjectId(processExecutionEntity1.getRelationshipAttribute(
+ AtlasObjectId process1 = toAtlasObjectId(processExecutionEntity1.getRelationshipAttribute(
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 1);
} catch (Exception e) {
System.out.print("Appending file error");
}
@@ -103,10 +113,10 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
// this file contains a single lineage record for "create view".
// there is no table vertex with createTime, which is lineage record generated by Impala
// originally. The table create time is hard-coded before Impala fixes this issue.
- String IMPALA = dir + "impalaCreateViewNoCreateTime.json";
+ String IMPALA = dir + "impalaCreateViewNoCreateTime.json";
String IMPALA_WAL = dir + "WALimpala.wal";
- List<ImpalaQuery> lineageList = new ArrayList<>();
+ List<ImpalaQuery> lineageList = new ArrayList<>();
ImpalaLineageHook impalaLineageHook = new ImpalaLineageHook();
try {
@@ -153,6 +163,13 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 1);
} catch (Exception e) {
System.out.print("Appending file error");
}
@@ -205,6 +222,13 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 1);
}
/**
@@ -254,6 +278,13 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 1);
}
/**
@@ -304,6 +335,13 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 0);
}
/**
@@ -341,6 +379,7 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
Thread.sleep(500);
IMPALA = dir + "impalaMultipleInsertIntoAsSelect2.json";
toolInstance.importHImpalaEntities(impalaLineageHook, IMPALA, IMPALA_WAL);
+ Thread.sleep(300);
// verify the process is saved in Atlas
// the value is from info in IMPALA_4.
@@ -371,5 +410,12 @@ public class ImpalaLineageToolIT extends ImpalaLineageITBase {
Assert.assertTrue(false, errorMessage);
}
}
+
+ String guid = assertTableIsRegistered(dbName, targetTableName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(guid).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 0);
}
}
\ No newline at end of file
diff --git a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/hook/ImpalaLineageHookIT.java b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/hook/ImpalaLineageHookIT.java
index 6156208..a7b9b0c 100644
--- a/addons/impala-bridge/src/test/java/org/apache/atlas/impala/hook/ImpalaLineageHookIT.java
+++ b/addons/impala-bridge/src/test/java/org/apache/atlas/impala/hook/ImpalaLineageHookIT.java
@@ -34,9 +34,13 @@ import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static org.apache.atlas.impala.hook.events.BaseImpalaEvent.ATTRIBUTE_DDL_QUERIES;
import static org.testng.Assert.assertFalse;
public class ImpalaLineageHookIT extends ImpalaLineageITBase {
@@ -138,19 +142,24 @@ public class ImpalaLineageHookIT extends ImpalaLineageITBase {
processQFName = processQFName.toLowerCase();
+ // check process and process execution entities
AtlasEntity processEntity1 = validateProcess(processQFName, queryObj.getQueryText());
AtlasEntity processExecutionEntity1 = validateProcessExecution(processEntity1, queryObj.getQueryText());
AtlasObjectId process1 = toAtlasObjectId(processExecutionEntity1.getRelationshipAttribute(
BaseImpalaEvent.ATTRIBUTE_PROCESS));
Assert.assertEquals(process1.getGuid(), processEntity1.getGuid());
Assert.assertEquals(numberOfProcessExecutions(processEntity1), 1);
+
+ // check DDL entity
+ String viewId = assertTableIsRegistered(viewName);
+ AtlasEntity entity = atlasClientV2.getEntityByGuid(viewId).getEntity();
+ List ddlQueries = (List) entity.getRelationshipAttribute(ATTRIBUTE_DDL_QUERIES);
+
+ assertNotNull(ddlQueries);
+ assertEquals(ddlQueries.size(), 1);
} catch (Exception ex) {
LOG.error("process create_view failed: ", ex);
assertFalse(true);
}
}
-
-
-
-
}
diff --git a/addons/models/0000-Area0/0010-base_model.json b/addons/models/0000-Area0/0010-base_model.json
index d14b227..1c80711 100644
--- a/addons/models/0000-Area0/0010-base_model.json
+++ b/addons/models/0000-Area0/0010-base_model.json
@@ -61,6 +61,48 @@
]
},
{
+ "name": "ddl",
+ "superTypes": [
+ "Referenceable"
+ ],
+ "serviceType": "atlas_core",
+ "typeVersion": "1.0",
+ "attributeDefs": [
+ {
+ "name": "queryText",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "execTime",
+ "typeName": "date",
+ "cardinality": "SINGLE",
+ "isIndexable": false,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "userName",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ },
+ {
+ "name": "serviceType",
+ "typeName": "string",
+ "cardinality": "SINGLE",
+ "isIndexable": true,
+ "isOptional": false,
+ "isUnique": false
+ }
+ ]
+ },
+ {
"name": "DataSet",
"superTypes": [
"Asset"
diff --git a/addons/models/1000-Hadoop/1030-hive_model.json b/addons/models/1000-Hadoop/1030-hive_model.json
index 417c4c5..8901aa4 100644
--- a/addons/models/1000-Hadoop/1030-hive_model.json
+++ b/addons/models/1000-Hadoop/1030-hive_model.json
@@ -533,43 +533,9 @@
]
},
{
- "name": "hive_ddl",
- "superTypes": [
- "Referenceable"
- ],
- "serviceType": "hive",
- "typeVersion": "1.0",
- "attributeDefs": [
- {
- "name": "queryText",
- "typeName": "string",
- "cardinality": "SINGLE",
- "isIndexable": true,
- "isOptional": false,
- "isUnique": false
- },
- {
- "name": "execTime",
- "typeName": "date",
- "cardinality": "SINGLE",
- "isIndexable": false,
- "isOptional": false,
- "isUnique": false
- },
- {
- "name": "userName",
- "typeName": "string",
- "cardinality": "SINGLE",
- "isIndexable": true,
- "isOptional": false,
- "isUnique": false
- }
- ]
- },
- {
"name": "hive_db_ddl",
"superTypes": [
- "hive_ddl"
+ "ddl"
],
"serviceType": "hive",
"typeVersion": "1.0",
@@ -578,7 +544,7 @@
{
"name": "hive_table_ddl",
"superTypes": [
- "hive_ddl"
+ "ddl"
],
"serviceType": "hive",
"typeVersion": "1.0",