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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4bb0871550 [hive] Add hive.skip-update-stats config option to control 
DO_NOT_UPDATE_STATS in HiveCatalog alter table (#7686)
4bb0871550 is described below

commit 4bb0871550ac9983146bea0f5da8ad5ba5dbf7a1
Author: cxzl25 <[email protected]>
AuthorDate: Sun May 31 10:23:15 2026 +0800

    [hive] Add hive.skip-update-stats config option to control 
DO_NOT_UPDATE_STATS in HiveCatalog alter table (#7686)
---
 docs/generated/hive_catalog_configuration.html               |  6 ++++++
 .../java/org/apache/paimon/hive/HiveAlterTableUtils.java     | 12 +++++++-----
 .../src/main/java/org/apache/paimon/hive/HiveCatalog.java    |  8 +++++++-
 .../main/java/org/apache/paimon/hive/HiveCatalogOptions.java |  8 ++++++++
 .../test/java/org/apache/paimon/hive/HiveTableStatsTest.java | 11 ++++++-----
 5 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/docs/generated/hive_catalog_configuration.html 
b/docs/generated/hive_catalog_configuration.html
index 48adc1114f..63eaab9327 100644
--- a/docs/generated/hive_catalog_configuration.html
+++ b/docs/generated/hive_catalog_configuration.html
@@ -56,6 +56,12 @@ Configure Priority: 1.from 'hadoop-conf-dir' 2.from 
HADOOP_CONF_DIR  3.from HADO
 If not configured, try to load from 'HIVE_CONF_DIR' env.
 </td>
         </tr>
+        <tr>
+            <td><h5>hive.skip-update-stats</h5></td>
+            <td style="word-wrap: break-word;">false</td>
+            <td>Boolean</td>
+            <td>If true, sets DO_NOT_UPDATE_STATS in the Hive 
EnvironmentContext when altering tables, preventing Hive from updating table 
statistics.</td>
+        </tr>
         <tr>
             <td><h5>location-in-properties</h5></td>
             <td style="word-wrap: break-word;">false</td>
diff --git 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveAlterTableUtils.java
 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveAlterTableUtils.java
index 06a0df9cff..7759a3fd93 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveAlterTableUtils.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveAlterTableUtils.java
@@ -29,20 +29,22 @@ import org.apache.thrift.TException;
 /** Utils for hive alter table. */
 public class HiveAlterTableUtils {
 
-    public static void alterTable(IMetaStoreClient client, Identifier 
identifier, Table table)
+    public static void alterTable(
+            IMetaStoreClient client, Identifier identifier, Table table, 
boolean skipUpdateStats)
             throws TException {
         try {
-            alterTableWithEnv(client, identifier, table);
+            alterTableWithEnv(client, identifier, table, skipUpdateStats);
         } catch (NoClassDefFoundError | NoSuchMethodError e) {
             alterTableWithoutEnv(client, identifier, table);
         }
     }
 
     private static void alterTableWithEnv(
-            IMetaStoreClient client, Identifier identifier, Table table) 
throws TException {
+            IMetaStoreClient client, Identifier identifier, Table table, 
boolean skipUpdateStats)
+            throws TException {
         boolean skipHiveUpdateStats =
-                Boolean.parseBoolean(
-                        
table.getParameters().get(StatsSetupConst.DO_NOT_UPDATE_STATS));
+                
Boolean.parseBoolean(table.getParameters().get(StatsSetupConst.DO_NOT_UPDATE_STATS))
+                        || skipUpdateStats;
         EnvironmentContext environmentContext = new EnvironmentContext();
         environmentContext.putToProperties(StatsSetupConst.CASCADE, "true");
         environmentContext.putToProperties(
diff --git 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
index 63ba25e1b5..c988d2b41a 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
@@ -116,6 +116,7 @@ import static 
org.apache.paimon.catalog.Identifier.DEFAULT_MAIN_BRANCH;
 import static org.apache.paimon.format.csv.CsvOptions.FIELD_DELIMITER;
 import static org.apache.paimon.hive.HiveCatalogOptions.HADOOP_CONF_DIR;
 import static org.apache.paimon.hive.HiveCatalogOptions.HIVE_CONF_DIR;
+import static org.apache.paimon.hive.HiveCatalogOptions.HIVE_SKIP_UPDATE_STATS;
 import static org.apache.paimon.hive.HiveCatalogOptions.IDENTIFIER;
 import static org.apache.paimon.hive.HiveCatalogOptions.LOCATION_IN_PROPERTIES;
 import static org.apache.paimon.hive.HiveTableUtils.tryToFormatSchema;
@@ -1292,7 +1293,12 @@ public class HiveCatalog extends AbstractCatalog {
         Path location = getTableLocation(identifier, table);
         // file format is null, because only data table support alter table.
         updateHmsTable(table, identifier, newSchema, null, location);
-        clients().execute(client -> HiveAlterTableUtils.alterTable(client, 
identifier, table));
+        boolean skipUpdateStats = options.get(HIVE_SKIP_UPDATE_STATS);
+        clients()
+                .execute(
+                        client ->
+                                HiveAlterTableUtils.alterTable(
+                                        client, identifier, table, 
skipUpdateStats));
     }
 
     @Override
diff --git 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalogOptions.java
 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalogOptions.java
index ceab498368..7700a763d0 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalogOptions.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalogOptions.java
@@ -72,6 +72,14 @@ public final class HiveCatalogOptions {
                     .defaultValue(TimeUnit.MINUTES.toMillis(5))
                     .withDescription("Setting the client's pool cache eviction 
interval(ms).\n");
 
+    public static final ConfigOption<Boolean> HIVE_SKIP_UPDATE_STATS =
+            ConfigOptions.key("hive.skip-update-stats")
+                    .booleanType()
+                    .defaultValue(false)
+                    .withDescription(
+                            "If true, sets DO_NOT_UPDATE_STATS in the Hive 
EnvironmentContext "
+                                    + "when altering tables, preventing Hive 
from updating table statistics.");
+
     public static final ConfigOption<String> CLIENT_POOL_CACHE_KEYS =
             ConfigOptions.key("client-pool-cache.keys")
                     .stringType()
diff --git 
a/paimon-hive/paimon-hive-catalog/src/test/java/org/apache/paimon/hive/HiveTableStatsTest.java
 
b/paimon-hive/paimon-hive-catalog/src/test/java/org/apache/paimon/hive/HiveTableStatsTest.java
index 35065eb43b..1d21bb56be 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/test/java/org/apache/paimon/hive/HiveTableStatsTest.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/test/java/org/apache/paimon/hive/HiveTableStatsTest.java
@@ -33,7 +33,6 @@ import org.apache.paimon.types.DataTypes;
 import org.apache.paimon.shade.guava30.com.google.common.collect.Lists;
 import org.apache.paimon.shade.guava30.com.google.common.collect.Maps;
 
-import org.apache.hadoop.hive.common.StatsSetupConst;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.metastore.api.Table;
 import org.junit.jupiter.api.BeforeEach;
@@ -44,6 +43,7 @@ import java.util.Collections;
 import java.util.UUID;
 
 import static 
org.apache.hadoop.hive.conf.HiveConf.ConfVars.METASTORECONNECTURLKEY;
+import static org.apache.paimon.hive.HiveCatalogOptions.HIVE_SKIP_UPDATE_STATS;
 import static org.assertj.core.api.Assertions.assertThat;
 
 /** Verify that table stats has been updated. */
@@ -59,7 +59,7 @@ public class HiveTableStatsTest {
         hiveConf.setVar(METASTORECONNECTURLKEY, jdoConnectionURL + 
";create=true");
         String metastoreClientClass = 
"org.apache.hadoop.hive.metastore.HiveMetaStoreClient";
         Options catalogOptions = new Options();
-        catalogOptions.set(StatsSetupConst.DO_NOT_UPDATE_STATS, "true");
+        catalogOptions.set(HIVE_SKIP_UPDATE_STATS, true);
         catalogOptions.set(CatalogOptions.WAREHOUSE, warehouse);
         CatalogContext catalogContext = CatalogContext.create(catalogOptions);
         FileIO fileIO = FileIO.get(new Path(warehouse), catalogContext);
@@ -81,14 +81,15 @@ public class HiveTableStatsTest {
                         Maps.newHashMap(),
                         ""),
                 false);
+        HiveCatalog hiveCatalog = (HiveCatalog) catalog;
+        Table table1 = hiveCatalog.getHmsTable(identifier);
         catalog.alterTable(
                 identifier,
                 Lists.newArrayList(
                         SchemaChange.addColumn("col2", DataTypes.DATE()),
                         SchemaChange.addColumn("col3", DataTypes.STRING(), 
"col3 field")),
                 false);
-        HiveCatalog hiveCatalog = (HiveCatalog) catalog;
-        Table table = hiveCatalog.getHmsTable(identifier);
-        
assertThat(table.getParameters().get("COLUMN_STATS_ACCURATE")).isEqualTo(null);
+        Table table2 = hiveCatalog.getHmsTable(identifier);
+        assertThat(table1.getParameters()).isEqualTo(table2.getParameters());
     }
 }

Reply via email to