You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by rx...@apache.org on 2015/06/10 18:45:48 UTC
spark git commit: [SPARK-8215] [SPARK-8212] [SQL] add leaf math
expression for e and pi
Repository: spark
Updated Branches:
refs/heads/master e90035e67 -> c6ba7cca3
[SPARK-8215] [SPARK-8212] [SQL] add leaf math expression for e and pi
Author: Daoyuan Wang <da...@intel.com>
Closes #6716 from adrian-wang/epi and squashes the following commits:
e2e8dbd [Daoyuan Wang] move tests
11b351c [Daoyuan Wang] add tests and remove pu
db331c9 [Daoyuan Wang] py style
599ddd8 [Daoyuan Wang] add py
e6783ef [Daoyuan Wang] register function
82d426e [Daoyuan Wang] add function entry
dbf3ab5 [Daoyuan Wang] add PI and E
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/c6ba7cca
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/c6ba7cca
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/c6ba7cca
Branch: refs/heads/master
Commit: c6ba7cca3338e3f4f719d86dbcff4406d949edc7
Parents: e90035e
Author: Daoyuan Wang <da...@intel.com>
Authored: Wed Jun 10 09:45:45 2015 -0700
Committer: Reynold Xin <rx...@databricks.com>
Committed: Wed Jun 10 09:45:45 2015 -0700
----------------------------------------------------------------------
.../catalyst/analysis/FunctionRegistry.scala | 2 ++
.../spark/sql/catalyst/expressions/math.scala | 35 ++++++++++++++++++++
.../expressions/MathFunctionsSuite.scala | 22 ++++++++++++
.../scala/org/apache/spark/sql/functions.scala | 18 ++++++++++
.../spark/sql/DataFrameFunctionsSuite.scala | 19 +++++++++++
5 files changed, 96 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/c6ba7cca/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala
index 936ffc7..ba89a5c 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala
@@ -106,6 +106,7 @@ object FunctionRegistry {
expression[Cbrt]("cbrt"),
expression[Ceil]("ceil"),
expression[Cos]("cos"),
+ expression[EulerNumber]("e"),
expression[Exp]("exp"),
expression[Expm1]("expm1"),
expression[Floor]("floor"),
@@ -113,6 +114,7 @@ object FunctionRegistry {
expression[Log]("log"),
expression[Log10]("log10"),
expression[Log1p]("log1p"),
+ expression[Pi]("pi"),
expression[Pow]("pow"),
expression[Rint]("rint"),
expression[Signum]("signum"),
http://git-wip-us.apache.org/repos/asf/spark/blob/c6ba7cca/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/math.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/math.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/math.scala
index 7dacb6a..e1d8c9a 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/math.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/math.scala
@@ -21,8 +21,33 @@ import org.apache.spark.sql.catalyst.expressions.codegen._
import org.apache.spark.sql.types.{DataType, DoubleType}
/**
+ * A leaf expression specifically for math constants. Math constants expect no input.
+ * @param c The math constant.
+ * @param name The short name of the function
+ */
+abstract class LeafMathExpression(c: Double, name: String)
+ extends LeafExpression with Serializable {
+ self: Product =>
+
+ override def dataType: DataType = DoubleType
+ override def foldable: Boolean = true
+ override def nullable: Boolean = false
+ override def toString: String = s"$name()"
+
+ override def eval(input: Row): Any = c
+
+ override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
+ s"""
+ boolean ${ev.isNull} = false;
+ ${ctx.javaType(dataType)} ${ev.primitive} = java.lang.Math.$name;
+ """
+ }
+}
+
+/**
* A unary expression specifically for math functions. Math Functions expect a specific type of
* input format, therefore these functions extend `ExpectsInputTypes`.
+ * @param f The math function.
* @param name The short name of the function
*/
abstract class UnaryMathExpression(f: Double => Double, name: String)
@@ -100,6 +125,16 @@ abstract class BinaryMathExpression(f: (Double, Double) => Double, name: String)
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
+// Leaf math functions
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+case class EulerNumber() extends LeafMathExpression(math.E, "E")
+
+case class Pi() extends LeafMathExpression(math.Pi, "PI")
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
// Unary math functions
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/spark/blob/c6ba7cca/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathFunctionsSuite.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathFunctionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathFunctionsSuite.scala
index 25ebc70..1fe6905 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathFunctionsSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathFunctionsSuite.scala
@@ -23,6 +23,20 @@ import org.apache.spark.sql.types.DoubleType
class MathFunctionsSuite extends SparkFunSuite with ExpressionEvalHelper {
/**
+ * Used for testing leaf math expressions.
+ *
+ * @param e expression
+ * @param c The constants in scala.math
+ * @tparam T Generic type for primitives
+ */
+ private def testLeaf[T](
+ e: () => Expression,
+ c: T): Unit = {
+ checkEvaluation(e(), c, EmptyRow)
+ checkEvaluation(e(), c, create_row(null))
+ }
+
+ /**
* Used for testing unary math expressions.
*
* @param c expression
@@ -74,6 +88,14 @@ class MathFunctionsSuite extends SparkFunSuite with ExpressionEvalHelper {
checkEvaluation(c(Literal(1.0), Literal.create(null, DoubleType)), null, create_row(null))
}
+ test("e") {
+ testLeaf(EulerNumber, math.E)
+ }
+
+ test("pi") {
+ testLeaf(Pi, math.Pi)
+ }
+
test("sin") {
testUnary(Sin, math.sin)
}
http://git-wip-us.apache.org/repos/asf/spark/blob/c6ba7cca/sql/core/src/main/scala/org/apache/spark/sql/functions.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/functions.scala b/sql/core/src/main/scala/org/apache/spark/sql/functions.scala
index 454af47..b3fc1e6 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/functions.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/functions.scala
@@ -945,6 +945,15 @@ object functions {
def cosh(columnName: String): Column = cosh(Column(columnName))
/**
+ * Returns the double value that is closer than any other to e, the base of the natural
+ * logarithms.
+ *
+ * @group math_funcs
+ * @since 1.5.0
+ */
+ def e(): Column = EulerNumber()
+
+ /**
* Computes the exponential of the given value.
*
* @group math_funcs
@@ -1106,6 +1115,15 @@ object functions {
def log1p(columnName: String): Column = log1p(Column(columnName))
/**
+ * Returns the double value that is closer than any other to pi, the ratio of the circumference
+ * of a circle to its diameter.
+ *
+ * @group math_funcs
+ * @since 1.5.0
+ */
+ def pi(): Column = Pi()
+
+ /**
* Returns the value of the first argument raised to the power of the second argument.
*
* @group math_funcs
http://git-wip-us.apache.org/repos/asf/spark/blob/c6ba7cca/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala
index 53c2bef..b93ad39 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala
@@ -85,6 +85,25 @@ class DataFrameFunctionsSuite extends QueryTest {
}
}
+ test("constant functions") {
+ checkAnswer(
+ testData2.select(e()).limit(1),
+ Row(scala.math.E)
+ )
+ checkAnswer(
+ testData2.select(pi()).limit(1),
+ Row(scala.math.Pi)
+ )
+ checkAnswer(
+ ctx.sql("SELECT E()"),
+ Row(scala.math.E)
+ )
+ checkAnswer(
+ ctx.sql("SELECT PI()"),
+ Row(scala.math.Pi)
+ )
+ }
+
test("bitwiseNOT") {
checkAnswer(
testData2.select(bitwiseNOT($"a")),
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org