aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Armbrust <michael@databricks.com>2014-08-17 19:00:38 -0700
committerMichael Armbrust <michael@databricks.com>2014-08-17 19:00:38 -0700
commitbfa09b01d7eddc572cd22ca2e418a735b4ccc826 (patch)
tree5c7ee5079e8e3a6a6d1ca92ece32461bb4323fe9
parent5ecb08ea063166564178885b7515abef0d76eecb (diff)
downloadspark-bfa09b01d7eddc572cd22ca2e418a735b4ccc826.tar.gz
spark-bfa09b01d7eddc572cd22ca2e418a735b4ccc826.tar.bz2
spark-bfa09b01d7eddc572cd22ca2e418a735b4ccc826.zip
[SQL] Improve debug logging and toStrings.
Author: Michael Armbrust <michael@databricks.com> Closes #2004 from marmbrus/codgenDebugging and squashes the following commits: b7a7e41 [Michael Armbrust] Improve debug logging and toStrings.
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala21
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/nullFunctions.scala2
2 files changed, 21 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala
index 5b398695bf..de2d67ce82 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala
@@ -78,7 +78,12 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
.build(
new CacheLoader[InType, OutType]() {
override def load(in: InType): OutType = globalLock.synchronized {
- create(in)
+ val startTime = System.nanoTime()
+ val result = create(in)
+ val endTime = System.nanoTime()
+ def timeMs = (endTime - startTime).toDouble / 1000000
+ logInfo(s"Code generated expression $in in $timeMs ms")
+ result
}
})
@@ -413,7 +418,19 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
""".children
}
- EvaluatedExpression(code, nullTerm, primitiveTerm, objectTerm)
+ // Only inject debugging code if debugging is turned on.
+ val debugCode =
+ if (log.isDebugEnabled) {
+ val localLogger = log
+ val localLoggerTree = reify { localLogger }
+ q"""
+ $localLoggerTree.debug(${e.toString} + ": " + (if($nullTerm) "null" else $primitiveTerm))
+ """ :: Nil
+ } else {
+ Nil
+ }
+
+ EvaluatedExpression(code ++ debugCode, nullTerm, primitiveTerm, objectTerm)
}
protected def getColumn(inputRow: TermName, dataType: DataType, ordinal: Int) = {
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/nullFunctions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/nullFunctions.scala
index ce6d99c911..e88c5d4fa1 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/nullFunctions.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/nullFunctions.scala
@@ -60,6 +60,8 @@ case class IsNull(child: Expression) extends Predicate with trees.UnaryNode[Expr
override def eval(input: Row): Any = {
child.eval(input) == null
}
+
+ override def toString = s"IS NULL $child"
}
case class IsNotNull(child: Expression) extends Predicate with trees.UnaryNode[Expression] {