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

hongze pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new 16f68a2203 [GLUTEN-7267][CORE][CH] Move schema pruning optimization of 
HiveTableScan to an individual post-transform rule (#8008)
16f68a2203 is described below

commit 16f68a2203e70075554e83adf15aec7676ad1d1f
Author: Hongze Zhang <[email protected]>
AuthorDate: Thu Nov 21 09:32:35 2024 +0800

    [GLUTEN-7267][CORE][CH] Move schema pruning optimization of HiveTableScan 
to an individual post-transform rule (#8008)
---
 .../gluten/backendsapi/clickhouse/CHBackend.scala  |  4 ---
 .../gluten/backendsapi/clickhouse/CHRuleApi.scala  |  1 +
 .../gluten/backendsapi/BackendSettingsApi.scala    |  2 --
 .../PruneNestedColumnsInHiveTableScan.scala        | 33 ++++++++++++++++++++++
 .../columnar/offload/OffloadSingleNodeRules.scala  | 11 ++------
 .../hive/HiveTableScanNestedColumnPruning.scala    | 12 ++++----
 6 files changed, 43 insertions(+), 20 deletions(-)

diff --git 
a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala
 
b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala
index 966e953199..98d1eabe57 100644
--- 
a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala
+++ 
b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala
@@ -407,8 +407,4 @@ object CHBackendSettings extends BackendSettingsApi with 
Logging {
   }
 
   override def supportWindowGroupLimitExec(rankLikeFunction: Expression): 
Boolean = true
-
-  override def supportHiveTableScanNestedColumnPruning: Boolean =
-    GlutenConfig.getConf.enableColumnarHiveTableScanNestedColumnPruning
-
 }
diff --git 
a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHRuleApi.scala
 
b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHRuleApi.scala
index 3525fc768d..081e815588 100644
--- 
a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHRuleApi.scala
+++ 
b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHRuleApi.scala
@@ -98,6 +98,7 @@ object CHRuleApi {
       c => intercept(HeuristicTransform.Single(validatorBuilder(c.glutenConf), 
rewrites, offloads)))
 
     // Legacy: Post-transform rules.
+    injector.injectPostTransform(_ => PruneNestedColumnsInHiveTableScan)
     injector.injectPostTransform(_ => RemoveNativeWriteFilesSortAndProject())
     injector.injectPostTransform(c => 
intercept(RewriteTransformer.apply(c.session)))
     injector.injectPostTransform(_ => PushDownFilterToScan)
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala
index 700571fd28..177d19c0c7 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala
@@ -131,6 +131,4 @@ trait BackendSettingsApi {
   def supportColumnarArrowUdf(): Boolean = false
 
   def needPreComputeRangeFrameBoundary(): Boolean = false
-
-  def supportHiveTableScanNestedColumnPruning(): Boolean = false
 }
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/PruneNestedColumnsInHiveTableScan.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/PruneNestedColumnsInHiveTableScan.scala
new file mode 100644
index 0000000000..b8972b6d0e
--- /dev/null
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/PruneNestedColumnsInHiveTableScan.scala
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.gluten.extension.columnar
+
+import org.apache.gluten.execution.ProjectExecTransformer
+
+import org.apache.spark.sql.catalyst.rules.Rule
+import org.apache.spark.sql.execution.SparkPlan
+import org.apache.spark.sql.hive.HiveTableScanNestedColumnPruning
+
+// Since https://github.com/apache/incubator-gluten/pull/7268.
+// Used only by CH backend as of now.
+object PruneNestedColumnsInHiveTableScan extends Rule[SparkPlan] {
+  override def apply(plan: SparkPlan): SparkPlan = plan.transformUp {
+    case p: ProjectExecTransformer
+        if HiveTableScanNestedColumnPruning.supportNestedColumnPruning(p) =>
+      HiveTableScanNestedColumnPruning.apply(p)
+  }
+}
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/offload/OffloadSingleNodeRules.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/offload/OffloadSingleNodeRules.scala
index 64448fc60a..0fee61acac 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/offload/OffloadSingleNodeRules.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/offload/OffloadSingleNodeRules.scala
@@ -37,7 +37,7 @@ import 
org.apache.spark.sql.execution.exchange.{BroadcastExchangeExec, ShuffleEx
 import org.apache.spark.sql.execution.joins._
 import org.apache.spark.sql.execution.python.{ArrowEvalPythonExec, 
BatchEvalPythonExec}
 import org.apache.spark.sql.execution.window.{WindowExec, 
WindowGroupLimitExecShim}
-import org.apache.spark.sql.hive.{HiveTableScanExecTransformer, 
HiveTableScanNestedColumnPruning}
+import org.apache.spark.sql.hive.HiveTableScanExecTransformer
 
 // Exchange transformation.
 case class OffloadExchange() extends OffloadSingleNode with LogLevelUtil {
@@ -188,7 +188,7 @@ object OffloadOthers {
   // Utility to replace single node within transformed Gluten node.
   // Children will be preserved as they are as children of the output node.
   //
-  // Do not look-up on children on the input node in this rule. Otherwise
+  // Do not look up on children on the input node in this rule. Otherwise
   // it may break RAS which would group all the possible input nodes to
   // search for validate candidates.
   private class ReplaceSingleNode() extends LogLevelUtil with Logging {
@@ -215,11 +215,7 @@ object OffloadOthers {
         case plan: ProjectExec =>
           val columnarChild = plan.child
           logDebug(s"Columnar Processing for ${plan.getClass} is currently 
supported.")
-          if 
(HiveTableScanNestedColumnPruning.supportNestedColumnPruning(plan)) {
-            HiveTableScanNestedColumnPruning.apply(plan)
-          } else {
-            ProjectExecTransformer(plan.projectList, columnarChild)
-          }
+          ProjectExecTransformer(plan.projectList, columnarChild)
         case plan: HashAggregateExec =>
           logDebug(s"Columnar Processing for ${plan.getClass} is currently 
supported.")
           HashAggregateExecBaseTransformer.from(plan)
@@ -247,7 +243,6 @@ object OffloadOthers {
             plan.bucketSpec,
             plan.options,
             plan.staticPartitions)
-
           ColumnarWriteFilesExec(
             writeTransformer,
             plan.fileFormat,
diff --git 
a/gluten-substrait/src/main/scala/org/apache/spark/sql/hive/HiveTableScanNestedColumnPruning.scala
 
b/gluten-substrait/src/main/scala/org/apache/spark/sql/hive/HiveTableScanNestedColumnPruning.scala
index 7a20e5c37d..70b08a2ed8 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/spark/sql/hive/HiveTableScanNestedColumnPruning.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/spark/sql/hive/HiveTableScanNestedColumnPruning.scala
@@ -16,13 +16,13 @@
  */
 package org.apache.spark.sql.hive
 
-import org.apache.gluten.backendsapi.BackendsApiManager
+import org.apache.gluten.GlutenConfig
 import org.apache.gluten.execution.ProjectExecTransformer
 
 import org.apache.spark.internal.Logging
 import org.apache.spark.sql.catalyst.catalog.HiveTableRelation
 import org.apache.spark.sql.catalyst.expressions._
-import org.apache.spark.sql.execution.{FilterExec, LeafExecNode, ProjectExec, 
SparkPlan}
+import org.apache.spark.sql.execution.{FilterExec, LeafExecNode, SparkPlan}
 import 
org.apache.spark.sql.hive.HiveTableScanExecTransformer.{ORC_INPUT_FORMAT_CLASS, 
PARQUET_INPUT_FORMAT_CLASS, TEXT_INPUT_FORMAT_CLASS}
 import org.apache.spark.sql.types.{ArrayType, DataType, MapType, StructType}
 import org.apache.spark.sql.util.SchemaUtils._
@@ -31,9 +31,9 @@ import org.apache.spark.util.Utils
 object HiveTableScanNestedColumnPruning extends Logging {
   import org.apache.spark.sql.catalyst.expressions.SchemaPruning._
 
-  def supportNestedColumnPruning(projectExec: ProjectExec): Boolean = {
-    if 
(BackendsApiManager.getSettings.supportHiveTableScanNestedColumnPruning()) {
-      projectExec.child match {
+  def supportNestedColumnPruning(project: ProjectExecTransformer): Boolean = {
+    if (GlutenConfig.getConf.enableColumnarHiveTableScanNestedColumnPruning) {
+      project.child match {
         case HiveTableScanExecTransformer(_, relation, _, _) =>
           relation.tableMeta.storage.inputFormat match {
             case Some(inputFormat)
@@ -60,7 +60,7 @@ object HiveTableScanNestedColumnPruning extends Logging {
 
   def apply(plan: SparkPlan): SparkPlan = {
     plan match {
-      case ProjectExec(projectList, child) =>
+      case ProjectExecTransformer(projectList, child) =>
         child match {
           case h: HiveTableScanExecTransformer =>
             val newPlan = prunePhysicalColumns(


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to