Skip to content

Commit 882007d

Browse files
author
Hongdan Zhu
committed
HIVE-28655: Implement HMS Related Drop Stats Changes, Reset COLUMN_STAT_ACCURATE After Dropping
1 parent 063cfa3 commit 882007d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7440,6 +7440,13 @@ public boolean delete_column_statistics_req(DeleteColumnStatisticsRequest req) t
74407440
}
74417441
events.add(new DeleteTableColumnStatEvent(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableName, colName, engine, this));
74427442
}
7443+
if (colNames == null){
7444+
// remove all column names in parameter COLUMN_STATS_ACCURATE
7445+
StatsSetupConst.clearColumnStatsState(table.getParameters());
7446+
} else {
7447+
// remove the deleted column names in parameter COLUMN_STATS_ACCURATE
7448+
StatsSetupConst.removeColumnStatsState(table.getParameters(), colNames);
7449+
}
74437450
}
74447451
} else {
74457452
List<String> partNames = new ArrayList<>();
@@ -7460,13 +7467,22 @@ public boolean delete_column_statistics_req(DeleteColumnStatisticsRequest req) t
74607467
.collect(Collectors.toList()) : colNames) {
74617468
for (String partName : partNames) {
74627469
List<String> partVals = getPartValsFromName(table, partName);
7470+
Partition partition = rawStore.getPartition(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableName, partVals);
7471+
Map<String, String> partParams = partition.getParameters();
74637472
if (transactionalListeners != null && !transactionalListeners.isEmpty()) {
74647473
MetaStoreListenerNotifier.notifyEvent(transactionalListeners, eventType,
74657474
new DeletePartitionColumnStatEvent(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableName,
74667475
partName, partVals, colName, engine, this));
74677476
}
74687477
events.add(new DeletePartitionColumnStatEvent(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableName,
74697478
partName, partVals, colName, engine, this));
7479+
if (colNames == null) {
7480+
// remove all column names in parameter COLUMN_STATS_ACCURATE
7481+
StatsSetupConst.clearColumnStatsState(partParams);
7482+
} else {
7483+
// remove the deleted column names in parameter COLUMN_STATS_ACCURATE
7484+
StatsSetupConst.removeColumnStatsState(partParams, colNames);
7485+
}
74707486
}
74717487
}
74727488
}

standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,6 +1846,11 @@ public void testColumnStatistics() throws Throwable {
18461846
List<ColumnStatisticsObj> stats = client.getTableColumnStatistics(
18471847
dbName, tblName, Lists.newArrayList(colName[1]), ENGINE);
18481848
assertTrue("stats are not empty: " + stats, stats.isEmpty());
1849+
// test if all columns are deleted from parameter COLUMN_STATS_ACCURATE
1850+
Map<String, String> tableParams = client.getTable(dbName, tblName).getParameters();
1851+
String table_column_stats_accurate = tableParams.get("COLUMN_STATS_ACCURATE");
1852+
assertTrue("parameter COLUMN_STATS_ACCURATE is not accurate in " + tblName, table_column_stats_accurate == null ||
1853+
(!table_column_stats_accurate.contains(colName[0]) && !table_column_stats_accurate.contains(colName[1])));
18491854

18501855
colStats.setStatsDesc(statsDesc);
18511856
colStats.setStatsObj(statsObjs);
@@ -1863,6 +1868,11 @@ public void testColumnStatistics() throws Throwable {
18631868
// multiple columns
18641869
request.setCol_names(Arrays.asList(colName));
18651870
assertTrue(client.deleteColumnStatistics(request));
1871+
// test if the columns in colName array are deleted from parameter COLUMN_STATS_ACCURATE
1872+
tableParams = client.getTable(dbName, tblName).getParameters();
1873+
table_column_stats_accurate = tableParams.get("COLUMN_STATS_ACCURATE");
1874+
assertTrue("parameter COLUMN_STATS_ACCURATE is not accurate in " + tblName, table_column_stats_accurate == null ||
1875+
(!table_column_stats_accurate.contains(colName[0]) && !table_column_stats_accurate.contains(colName[1])));
18661876
colStats3 = client.getTableColumnStatistics(
18671877
dbName, tblName, Lists.newArrayList(colName), ENGINE);
18681878
assertTrue("stats are not empty: " + colStats3, colStats3.isEmpty());
@@ -1958,6 +1968,12 @@ public void testColumnStatistics() throws Throwable {
19581968
Lists.newArrayList(partitions.get(0), partitions.get(1), partitions.get(2)), Lists.newArrayList(colName), ENGINE);
19591969
assertEquals(1, stats2.size());
19601970
assertEquals(2, stats2.get(partitions.get(2)).size());
1971+
// test if all columns are deleted from parameter COLUMN_STATS_ACCURATE
1972+
Partition partition_0 = client.getPartition(dbName, tblName, partitions.get(0));
1973+
Map<String, String> partitionParams = partition_0.getParameters();
1974+
String partition_column_stats_accurate = partitionParams.get("COLUMN_STATS_ACCURATE");
1975+
assertTrue("parameter COLUMN_STATS_ACCURATE is not accurate in " + partitions.get(0),partition_column_stats_accurate == null ||
1976+
(!table_column_stats_accurate.contains(colName[0]) && !table_column_stats_accurate.contains(colName[1])));
19611977

19621978
// no partition or column name is set
19631979
request.unsetPart_names();

0 commit comments

Comments
 (0)