Skip to content

Commit bf9f07b

Browse files
committed
Impl common explain field formatter
1 parent 8ebbf85 commit bf9f07b

File tree

10 files changed

+188
-130
lines changed

10 files changed

+188
-130
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,11 @@ abstract class QueryPlan[PlanType <: QueryPlan[PlanType]] extends TreeNode[PlanT
189189
val codegenIdStr =
190190
getTagValue(QueryPlan.CODEGEN_ID_TAG).map(id => s"[codegen id : $id]").getOrElse("")
191191
val operatorId = getTagValue(QueryPlan.OP_ID_TAG).map(id => s"$id").getOrElse("unknown")
192+
val argStr = argString(SQLConf.get.maxToStringFields)
193+
192194
s"""
193195
|($operatorId) $nodeName $codegenIdStr
196+
|Arguments: ${if (argStr != null && !argStr.isEmpty) argStr else "None"}
194197
""".stripMargin
195198
}
196199

sql/core/src/main/scala/org/apache/spark/sql/execution/DataSourceScanExec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ trait DataSourceScanExec extends LeafExecNode {
7676

7777
s"""
7878
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
79-
|Output: ${producedAttributes.mkString("[", ", ", "]")}
79+
|${ExplainUtils.generateFieldString("Output", producedAttributes)}
8080
|${metadataStr.mkString("\n")}
8181
""".stripMargin
8282
}
@@ -377,7 +377,7 @@ case class FileSourceScanExec(
377377

378378
s"""
379379
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
380-
|Output: ${producedAttributes.mkString("[", ", ", "]")}
380+
|${ExplainUtils.generateFieldString("Output", producedAttributes)}
381381
|${metadataStr.mkString("\n")}
382382
""".stripMargin
383383
}

sql/core/src/main/scala/org/apache/spark/sql/execution/ExplainUtils.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import scala.collection.mutable.ArrayBuffer
2323
import org.apache.spark.sql.AnalysisException
2424
import org.apache.spark.sql.catalyst.expressions.{Expression, PlanExpression}
2525
import org.apache.spark.sql.catalyst.plans.QueryPlan
26-
import org.apache.spark.sql.catalyst.trees.TreeNodeTag
2726

2827
object ExplainUtils {
2928
/**
@@ -171,7 +170,7 @@ object ExplainUtils {
171170
var currentCodegenId = -1
172171
plan.foreach {
173172
case p: WholeStageCodegenExec => currentCodegenId = p.codegenStageId
174-
case p: InputAdapter => currentCodegenId = -1
173+
case _: InputAdapter => currentCodegenId = -1
175174
case other: QueryPlan[_] =>
176175
if (currentCodegenId != -1) {
177176
other.setTagValue(QueryPlan.CODEGEN_ID_TAG, currentCodegenId)
@@ -182,6 +181,17 @@ object ExplainUtils {
182181
}
183182
}
184183

184+
/**
185+
* Generate detailed field string with different format based on type of input value
186+
*/
187+
def generateFieldString(fieldName: String, values: Any): String = values match {
188+
case iter: Iterable[_] if (iter.size == 0) => s"${fieldName}: []"
189+
case iter: Iterable[_] => s"${fieldName} [${iter.size}]: ${iter.mkString("[", ", ", "]")}"
190+
case str: String if (str == null || str.isEmpty) => s"${fieldName}: None"
191+
case str: String => s"${fieldName}: ${str}"
192+
case _ => s"${fieldName}: Unknown"
193+
}
194+
185195
/**
186196
* Given a input plan, returns an array of tuples comprising of :
187197
* 1. Hosting opeator id.

sql/core/src/main/scala/org/apache/spark/sql/execution/SparkPlan.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
3434
import org.apache.spark.sql.catalyst.plans.physical._
3535
import org.apache.spark.sql.catalyst.trees.TreeNodeTag
3636
import org.apache.spark.sql.execution.metric.SQLMetric
37+
import org.apache.spark.sql.internal.SQLConf
3738
import org.apache.spark.sql.vectorized.ColumnarBatch
3839

3940
object SparkPlan {
@@ -512,9 +513,11 @@ trait LeafExecNode extends SparkPlan {
512513
override final def children: Seq[SparkPlan] = Nil
513514
override def producedAttributes: AttributeSet = outputSet
514515
override def verboseStringWithOperatorId(): String = {
516+
val argumentString = argString(SQLConf.get.maxToStringFields)
515517
s"""
516518
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
517-
|Output: ${producedAttributes.mkString("[", ", ", "]")}
519+
|${ExplainUtils.generateFieldString("Arguments", argumentString)}
520+
|${ExplainUtils.generateFieldString("Output", producedAttributes)}
518521
""".stripMargin
519522
}
520523
}
@@ -531,9 +534,11 @@ trait UnaryExecNode extends SparkPlan {
531534

532535
override final def children: Seq[SparkPlan] = child :: Nil
533536
override def verboseStringWithOperatorId(): String = {
537+
val argumentString = argString(SQLConf.get.maxToStringFields)
534538
s"""
535539
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
536-
|Input: ${child.output.mkString("[", ", ", "]")}
540+
|${ExplainUtils.generateFieldString("Input", child.output)}
541+
|${ExplainUtils.generateFieldString("Arguments", argumentString)}
537542
""".stripMargin
538543
}
539544
}
@@ -544,10 +549,12 @@ trait BinaryExecNode extends SparkPlan {
544549

545550
override final def children: Seq[SparkPlan] = Seq(left, right)
546551
override def verboseStringWithOperatorId(): String = {
552+
val argumentString = argString(SQLConf.get.maxToStringFields)
547553
s"""
548554
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
549-
|Left output: ${left.output.mkString("[", ", ", "]")}
550-
|Right output: ${right.output.mkString("[", ", ", "]")}
555+
|${ExplainUtils.generateFieldString("Left output", left.output)}
556+
|${ExplainUtils.generateFieldString("Right output", right.output)}
557+
|${ExplainUtils.generateFieldString("Arguments", argumentString)}
551558
""".stripMargin
552559
}
553560
}

sql/core/src/main/scala/org/apache/spark/sql/execution/basicPhysicalOperators.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ case class ProjectExec(projectList: Seq[NamedExpression], child: SparkPlan)
8686
override def verboseStringWithOperatorId(): String = {
8787
s"""
8888
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
89-
|Output : ${projectList.mkString("[", ", ", "]")}
90-
|Input : ${child.output.mkString("[", ", ", "]")}
89+
|${ExplainUtils.generateFieldString("Output", projectList)}
90+
|${ExplainUtils.generateFieldString("Input", child.output)}
9191
""".stripMargin
9292
}
9393
}
@@ -243,7 +243,7 @@ case class FilterExec(condition: Expression, child: SparkPlan)
243243
override def verboseStringWithOperatorId(): String = {
244244
s"""
245245
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
246-
|Input : ${child.output.mkString("[", ", ", "]")}
246+
|${ExplainUtils.generateFieldString("Input", child.output)}
247247
|Condition : ${condition}
248248
""".stripMargin
249249
}

sql/core/src/main/scala/org/apache/spark/sql/execution/exchange/Exchange.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ case class ReusedExchangeExec(override val output: Seq[Attribute], child: Exchan
9292
val reuse_op_str = ExplainUtils.getOpId(child)
9393
s"""
9494
|(${ExplainUtils.getOpId(this)}) $nodeName ${cdgen} [Reuses operator id: $reuse_op_str]
95-
|Output : ${output}
95+
|${ExplainUtils.generateFieldString("Output", output)}
9696
""".stripMargin
9797
}
9898
}

sql/core/src/main/scala/org/apache/spark/sql/execution/joins/CartesianProductExec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ case class CartesianProductExec(
7373

7474
s"""
7575
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
76-
|Join condition: ${joinCondStr}
76+
|${ExplainUtils.generateFieldString("Join condition", joinCondStr)}
7777
""".stripMargin
7878
}
7979

sql/core/src/main/scala/org/apache/spark/sql/execution/joins/HashJoin.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ trait HashJoin {
4949

5050
s"""
5151
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
52-
|Left keys: ${leftKeys}
53-
|Right keys: ${rightKeys}
54-
|Join condition: ${joinCondStr}
52+
|${ExplainUtils.generateFieldString("Left keys", leftKeys)}
53+
|${ExplainUtils.generateFieldString("Right keys", rightKeys)}
54+
|${ExplainUtils.generateFieldString("Join condition", joinCondStr)}
5555
""".stripMargin
5656
}
5757

sql/core/src/main/scala/org/apache/spark/sql/execution/joins/SortMergeJoinExec.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ case class SortMergeJoinExec(
6363
} else "None"
6464
s"""
6565
|(${ExplainUtils.getOpId(this)}) $nodeName ${ExplainUtils.getCodegenId(this)}
66-
|Left keys : ${leftKeys}
67-
|Right keys: ${rightKeys}
68-
|Join condition : ${joinCondStr}
66+
|${ExplainUtils.generateFieldString("Left keys", leftKeys)}
67+
|${ExplainUtils.generateFieldString("Right keys", rightKeys)}
68+
|${ExplainUtils.generateFieldString("Join condition", joinCondStr)}
6969
""".stripMargin
7070
}
7171

0 commit comments

Comments
 (0)