[ 
https://issues.apache.org/jira/browse/SPARK-8279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15117924#comment-15117924
 ] 

Mark Hamstra commented on SPARK-8279:
-------------------------------------

It's a bit of an under-defined mess, actually.  I don't have a SQL Standard 
document in front of me to be able to say whether any of the standards 
specifies a particular rounding scheme.  W3 suggests: "Many database systems 
have adopted the IEEE 754 standard for arithmetic operations, according to 
which the default rounding behavior is 'round half to even.'" PostgreSQL and 
Oracle both use round half away from zero for NUMBER values but bankers 
rounding/half-even for BINARY_FLOAT and BINARY_DOUBLE (cf. IEEE754 Conformance 
for BINARY_FLOAT and BINARY_DOUBLE in 
https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF0021 -- 
where for these types "The default rounding mode [i.e. round half to even] is 
supported."  Other data-related tools also don't rigorously adhere to a 
standard rounding scheme, and Microsoft products are not consistent across, 
e.g., versions of VB, .NET, SQL Server, and EXCEL.

Much of the time, the precise rounding scheme being used doesn't matter much.  
When it does matter, though, we should at least have the ability to require 
that bankers rounding (and perhaps other rounding schemes) be enforced.

> udf_round_3 test fails
> ----------------------
>
>                 Key: SPARK-8279
>                 URL: https://issues.apache.org/jira/browse/SPARK-8279
>             Project: Spark
>          Issue Type: Sub-task
>          Components: SQL
>            Reporter: Reynold Xin
>            Assignee: Yijie Shen
>            Priority: Blocker
>             Fix For: 1.5.0
>
>
> query
> {code}
> select round(cast(negative(pow(2, 31)) as INT)), round(cast((pow(2, 31) - 1) 
> as INT)), round(-32769), round(32768) from src tablesample (1 rows);
> {code}
> {code}
> [info] - udf_round_3 *** FAILED *** (4 seconds, 803 milliseconds)
> [info]   Failed to execute query using catalyst:
> [info]   Error: java.lang.Integer cannot be cast to java.lang.Double
> [info]   java.lang.ClassCastException: java.lang.Integer cannot be cast to 
> java.lang.Double
> [info]        at 
> scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.BinaryMathExpression.eval(math.scala:86)
> [info]        at 
> org.apache.spark.sql.hive.HiveInspectors$class.toInspector(HiveInspectors.scala:628)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.toInspector(hiveUdfs.scala:148)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf$$anonfun$argumentInspectors$1.apply(hiveUdfs.scala:160)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf$$anonfun$argumentInspectors$1.apply(hiveUdfs.scala:160)
> [info]        at 
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
> [info]        at 
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
> [info]        at scala.collection.immutable.List.foreach(List.scala:318)
> [info]        at 
> scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
> [info]        at 
> scala.collection.AbstractTraversable.map(Traversable.scala:105)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.argumentInspectors$lzycompute(hiveUdfs.scala:160)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.argumentInspectors(hiveUdfs.scala:160)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.returnInspector$lzycompute(hiveUdfs.scala:164)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.returnInspector(hiveUdfs.scala:163)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.dataType$lzycompute(hiveUdfs.scala:180)
> [info]        at 
> org.apache.spark.sql.hive.HiveGenericUdf.dataType(hiveUdfs.scala:180)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Cast.resolved$lzycompute(Cast.scala:31)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Cast.resolved(Cast.scala:31)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$childrenResolved$1.apply(Expression.scala:121)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$childrenResolved$1.apply(Expression.scala:121)
> [info]        at 
> scala.collection.LinearSeqOptimized$class.forall(LinearSeqOptimized.scala:70)
> [info]        at scala.collection.immutable.List.forall(List.scala:84)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression.childrenResolved(Expression.scala:121)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression.resolved$lzycompute(Expression.scala:109)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression.resolved(Expression.scala:109)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$childrenResolved$1.apply(Expression.scala:121)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$childrenResolved$1.apply(Expression.scala:121)
> [info]        at 
> scala.collection.LinearSeqOptimized$class.forall(LinearSeqOptimized.scala:70)
> [info]        at scala.collection.immutable.List.forall(List.scala:84)
> [info]        at 
> org.apache.spark.sql.catalyst.expressions.Expression.childrenResolved(Expression.scala:121)
> [info]        at 
> org.apache.spark.sql.catalyst.analysis.HiveTypeCoercion$ConvertNaNs$$anonfun$apply$2$$anonfun$applyOrElse$2.applyOrElse(HiveTypeCoercion.scala:138)
> [info]        at 
> org.apache.spark.sql.catalyst.analysis.HiveTypeCoercion$ConvertNaNs$$anonfun$apply$2$$anonfun$applyOrElse$2.applyOrElse(HiveTypeCoercion.scala:136)
> [info]        at 
> org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:222)
> [info]        at 
> org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:222)
> [info]        at 
> org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:51)
> [info]        at 
> org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:221)
> [info]        at 
> org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$transformExpressionDown$1(QueryPlan.scala:75)
> [info]        at 
> org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1$$anonfun$apply$1.apply(QueryPlan.scala:90)
> [info]        at 
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
> [info]        at 
> scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
> [info]        at 
> scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
> [info]        at 
> scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
> [info]        at 
> scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
> [info]        at 
> scala.collection.AbstractTraversable.map(Traversable.scala:105)
> [info]        at 
> org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1.apply(QueryPlan.scala:89)
> [info]        at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
> [info]        at scala.collection.Iterator$class.foreach(Iterator.scala:727)
> [info]        at 
> scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
> [info]        at 
> scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
> [info]        at 
> scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:103)
> [info]        at 
> scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:47)
> [info]        at 
> scala.collection.TraversableOnce$class.to(TraversableOnce.scala:273)
> [info]        at scala.collection.AbstractIterator.to(Iterator.scala:1157)
> [info]        at 
> scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:265)
> [info]        at 
> scala.collection.AbstractIterator.toBuffer(Iterator.scala:1157)
> [info]        at 
> scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:252)
> [info]        at 
> scala.collection.AbstractIterator.toArray(Iterator.scala:1157)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to