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 00b71e80a6 [GLUTEN-7359][VL] Enable partial project in RAS (#7574)
00b71e80a6 is described below

commit 00b71e80a6a4bca999e2c0d7bd55aacddcb0bffa
Author: Hongze Zhang <[email protected]>
AuthorDate: Fri Oct 18 11:41:20 2024 +0800

    [GLUTEN-7359][VL] Enable partial project in RAS (#7574)
---
 .../apache/gluten/backendsapi/velox/VeloxRuleApi.scala   |  1 +
 .../gluten/execution/ColumnarPartialProjectExec.scala    |  2 +-
 .../gluten/expression/UDFPartialProjectSuite.scala       | 16 +++++++++++++++-
 .../org/apache/gluten/expression/ExpressionUtils.scala   |  2 +-
 .../gluten/extension/columnar/validator/Validators.scala |  2 +-
 .../org/apache/gluten/planner/cost/LegacyCostModel.scala |  6 +++++-
 6 files changed, 24 insertions(+), 5 deletions(-)

diff --git 
a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxRuleApi.scala
 
b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxRuleApi.scala
index 65bf7844c6..84257ed3f7 100644
--- 
a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxRuleApi.scala
+++ 
b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxRuleApi.scala
@@ -110,6 +110,7 @@ private object VeloxRuleApi {
 
     // Gluten RAS: Post rules.
     injector.inject(_ => RemoveTransitions)
+    injector.inject(c => PartialProjectRule.apply(c.session))
     injector.inject(_ => RemoveNativeWriteFilesSortAndProject())
     injector.inject(c => RewriteTransformer.apply(c.session))
     injector.inject(_ => PushDownFilterToScan)
diff --git 
a/backends-velox/src/main/scala/org/apache/gluten/execution/ColumnarPartialProjectExec.scala
 
b/backends-velox/src/main/scala/org/apache/gluten/execution/ColumnarPartialProjectExec.scala
index d42b7eecf6..fc0fc041a4 100644
--- 
a/backends-velox/src/main/scala/org/apache/gluten/execution/ColumnarPartialProjectExec.scala
+++ 
b/backends-velox/src/main/scala/org/apache/gluten/execution/ColumnarPartialProjectExec.scala
@@ -157,7 +157,7 @@ case class ColumnarPartialProjectExec(original: 
ProjectExec, child: SparkPlan)(
       return ValidationResult.failed("Contains expression not supported")
     }
     if (
-      ExpressionUtils.isComplexExpression(
+      ExpressionUtils.hasComplexExpressions(
         original,
         GlutenConfig.getConf.fallbackExpressionsThreshold)
     ) {
diff --git 
a/backends-velox/src/test/scala/org/apache/gluten/expression/UDFPartialProjectSuite.scala
 
b/backends-velox/src/test/scala/org/apache/gluten/expression/UDFPartialProjectSuite.scala
index cd3d0c531c..757d4da131 100644
--- 
a/backends-velox/src/test/scala/org/apache/gluten/expression/UDFPartialProjectSuite.scala
+++ 
b/backends-velox/src/test/scala/org/apache/gluten/expression/UDFPartialProjectSuite.scala
@@ -24,7 +24,21 @@ import org.apache.spark.sql.functions.udf
 
 import java.io.File
 
-class UDFPartialProjectSuite extends WholeStageTransformerSuite {
+class UDFPartialProjectSuiteRasOff extends UDFPartialProjectSuite {
+  override protected def sparkConf: SparkConf = {
+    super.sparkConf
+      .set("spark.gluten.ras.enabled", "false")
+  }
+}
+
+class UDFPartialProjectSuiteRasOn extends UDFPartialProjectSuite {
+  override protected def sparkConf: SparkConf = {
+    super.sparkConf
+      .set("spark.gluten.ras.enabled", "true")
+  }
+}
+
+abstract class UDFPartialProjectSuite extends WholeStageTransformerSuite {
   disableFallbackCheck
   override protected val resourcePath: String = "/tpch-data-parquet-velox"
   override protected val fileFormat: String = "parquet"
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionUtils.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionUtils.scala
index db129c734c..1182791c6e 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionUtils.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionUtils.scala
@@ -33,7 +33,7 @@ object ExpressionUtils {
     }
   }
 
-  def isComplexExpression(plan: SparkPlan, threshold: Int): Boolean = {
+  def hasComplexExpressions(plan: SparkPlan, threshold: Int): Boolean = {
     plan.expressions.exists(e => ExpressionUtils.getExpressionTreeDepth(e) > 
threshold)
   }
 }
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
index 404df5edad..50201efc07 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
@@ -118,7 +118,7 @@ object Validators {
 
   private class FallbackComplexExpressions(threshold: Int) extends Validator {
     override def validate(plan: SparkPlan): Validator.OutCome = {
-      if (ExpressionUtils.isComplexExpression(plan, threshold)) {
+      if (ExpressionUtils.hasComplexExpressions(plan, threshold)) {
         return fail(
           s"Disabled because at least one present expression exceeded depth 
threshold: " +
             s"${plan.nodeName}")
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/planner/cost/LegacyCostModel.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/planner/cost/LegacyCostModel.scala
index 9810656197..c6f4f1fc9f 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/planner/cost/LegacyCostModel.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/planner/cost/LegacyCostModel.scala
@@ -19,7 +19,7 @@ package org.apache.gluten.planner.cost
 import org.apache.gluten.extension.columnar.transition.{ColumnarToRowLike, 
RowToColumnarLike}
 import org.apache.gluten.utils.PlanUtil
 
-import org.apache.spark.sql.execution.{ColumnarToRowExec, RowToColumnarExec, 
SparkPlan}
+import org.apache.spark.sql.execution.{ColumnarToRowExec, ProjectExec, 
RowToColumnarExec, SparkPlan}
 
 /**
  * A cost model that is supposed to drive RAS planner create the same query 
plan with legacy
@@ -37,6 +37,10 @@ class LegacyCostModel extends LongCostModel {
       case ColumnarToRowLike(_) => 10L
       case RowToColumnarLike(_) => 10L
       case p if PlanUtil.isGlutenColumnarOp(p) => 10L
+      // 1. 100L << 1000L, to keep the pulled out non-offload-able projects if 
the main op
+      // turns into offload-able after pulling.
+      // 2. 100L >> 10L, to offload project op itself eagerly.
+      case ProjectExec(_, _) => 100L
       case p if PlanUtil.isVanillaColumnarOp(p) => 1000L
       // Other row ops. Usually a vanilla row op.
       case _ => 1000L


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

Reply via email to