This is an automated email from the ASF dual-hosted git repository.
dkuzmenko 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 bb3d2222fcf HIVE-26446: HiveProtoLoggingHook fails to populate
TablesWritten field for partitioned tables (Simhadri Govindappa, reviewed by
Denys Kuzmenko)
bb3d2222fcf is described below
commit bb3d2222fcfc55c7bc1e373d0ea2b2729259851c
Author: SimhadriGovindappa <[email protected]>
AuthorDate: Wed Aug 17 13:39:41 2022 +0530
HIVE-26446: HiveProtoLoggingHook fails to populate TablesWritten field for
partitioned tables (Simhadri Govindappa, reviewed by Denys Kuzmenko)
Closes #3499
---
.../hadoop/hive/ql/hooks/HiveProtoLoggingHook.java | 4 +-
.../hive/ql/hooks/TestHiveProtoLoggingHook.java | 75 ++++++++++++++++++++++
2 files changed, 78 insertions(+), 1 deletion(-)
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveProtoLoggingHook.java
b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveProtoLoggingHook.java
index 640a1ca97bc..904dd4bebde 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveProtoLoggingHook.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveProtoLoggingHook.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.hive.ql.hooks;
+import static org.apache.hadoop.hive.ql.hooks.Entity.Type.PARTITION;
+import static org.apache.hadoop.hive.ql.hooks.Entity.Type.TABLE;
import static org.apache.hadoop.hive.ql.plan.HiveOperation.ALTERDATABASE;
import static org.apache.hadoop.hive.ql.plan.HiveOperation.ALTERDATABASE_OWNER;
import static
org.apache.hadoop.hive.ql.plan.HiveOperation.ALTERPARTITION_BUCKETNUM;
@@ -487,7 +489,7 @@ public class HiveProtoLoggingHook implements
ExecuteWithHookContext {
private List<String> getTablesFromEntitySet(Set<? extends Entity>
entities) {
List<String> tableNames = new ArrayList<>();
for (Entity entity : entities) {
- if (entity.getType() == Entity.Type.TABLE) {
+ if (entity.getType() == TABLE || entity.getType() == PARTITION) {
tableNames.add(entity.getTable().getDbName() + "." +
entity.getTable().getTableName());
}
}
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveProtoLoggingHook.java
b/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveProtoLoggingHook.java
index ff282dd6a81..100a672f9b6 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveProtoLoggingHook.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveProtoLoggingHook.java
@@ -21,6 +21,8 @@ package org.apache.hadoop.hive.ql.hooks;
import java.io.EOFException;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -31,6 +33,8 @@ import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants;
import org.apache.hadoop.hive.ql.QueryPlan;
import org.apache.hadoop.hive.ql.QueryState;
import org.apache.hadoop.hive.ql.exec.mr.ExecDriver;
@@ -43,6 +47,8 @@ import org.apache.hadoop.hive.ql.hooks.HookContext.HookType;
import org.apache.hadoop.hive.ql.hooks.proto.HiveHookEvents.HiveHookEventProto;
import org.apache.hadoop.hive.ql.hooks.proto.HiveHookEvents.MapFieldEntry;
import org.apache.hadoop.hive.ql.log.PerfLogger;
+import org.apache.hadoop.hive.ql.metadata.Partition;
+import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.plan.HiveOperation;
import org.apache.hadoop.hive.ql.plan.MapWork;
import org.apache.hadoop.hive.ql.plan.TezWork;
@@ -123,6 +129,16 @@ public class TestHiveProtoLoggingHook {
assertOtherInfo(event, OtherInfoType.QUERY, null);
}
+ @Test
+ public void testNonPartionedTable() throws Exception {
+ testTablesWritten(new WriteEntity(newTable(false),
WriteEntity.WriteType.INSERT), false);
+ }
+
+ @Test
+ public void testPartitionedTable() throws Exception {
+ testTablesWritten(addPartitionOutput(newTable(true),
WriteEntity.WriteType.INSERT), true);
+ }
+
@Test
public void testQueueLogs() throws Exception {
context.setHookType(HookType.PRE_EXEC_HOOK);
@@ -322,4 +338,63 @@ public class TestHiveProtoLoggingHook {
Assert.assertEquals(value, val);
}
}
+
+ private void testTablesWritten(WriteEntity we, boolean isPartitioned) throws
Exception {
+ String query = isPartitioned ?
+ "insert into test_partition partition(dt = '20220102', lable =
'test1') values('20220103', 'banana');" :
+ "insert into default.testTable1 values('ab')";
+ HashSet<WriteEntity> tableWritten = new HashSet<>();
+ tableWritten.add(we);
+ QueryState state = new QueryState.Builder().withHiveConf(conf).build();
+ @SuppressWarnings("serial")
+ QueryPlan queryPlan = new QueryPlan(HiveOperation.QUERY) {
+ };
+ queryPlan.setQueryId("test_queryId");
+ queryPlan.setQueryStartTime(1234L);
+ queryPlan.setQueryString(query);
+ queryPlan.setRootTasks(new ArrayList<>());
+ queryPlan.setInputs(new HashSet<>());
+ queryPlan.setOutputs(tableWritten);
+ PerfLogger perf = PerfLogger.getPerfLogger(conf, true);
+ HookContext ctx = new HookContext(queryPlan, state, null, "test_user",
"192.168.10.11",
+ "hive_addr", "test_op_id", "test_session_id", "test_thread_id",
true, perf, null);
+
+ ctx.setHookType(HookType.PRE_EXEC_HOOK);
+ EventLogger evtLogger = new EventLogger(conf, SystemClock.getInstance());
+ evtLogger.handle(ctx);
+ evtLogger.shutdown();
+
+ HiveHookEventProto event = loadEvent(conf, tmpFolder);
+
+ Assert.assertEquals(EventType.QUERY_SUBMITTED.name(),
event.getEventType());
+ Assert.assertEquals(we.getTable().getFullyQualifiedName(),
event.getTablesWritten(0));
+ }
+
+ private Table newTable(boolean isPartitioned) {
+ Table t = new Table("default", "testTable");
+ if (isPartitioned) {
+ FieldSchema fs = new FieldSchema();
+ fs.setName("version");
+ fs.setType("String");
+ List<FieldSchema> partCols = new ArrayList<FieldSchema>(1);
+ partCols.add(fs);
+ t.setPartCols(partCols);
+ }
+ Map<String, String> tblProps = t.getParameters();
+ if (tblProps == null) {
+ tblProps = new HashMap<>();
+ }
+ tblProps.put(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL, "true");
+ t.setParameters(tblProps);
+ return t;
+ }
+
+ private WriteEntity addPartitionOutput(Table t, WriteEntity.WriteType
writeType) throws Exception {
+ Map<String, String> partSpec = new HashMap<String, String>();
+ partSpec.put("version", Integer.toString(1));
+ Partition p = new Partition(t, partSpec, new Path("/dev/null"));
+ WriteEntity we = new WriteEntity(p, writeType);
+ return we;
+ }
+
}