aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorWenchen Fan <cloud0fan@outlook.com>2015-07-09 00:26:25 -0700
committerReynold Xin <rxin@databricks.com>2015-07-09 00:26:25 -0700
commit09cb0d9c2dcb83818ced22ff9bd6a51688ea7ffe (patch)
treee9f59894831d461437b1cd1e37537181d4259999 /sql
parent851e247caad0977cfd4998254d9602624e06539f (diff)
downloadspark-09cb0d9c2dcb83818ced22ff9bd6a51688ea7ffe.tar.gz
spark-09cb0d9c2dcb83818ced22ff9bd6a51688ea7ffe.tar.bz2
spark-09cb0d9c2dcb83818ced22ff9bd6a51688ea7ffe.zip
[SPARK-8942][SQL] use double not decimal when cast double and float to timestamp
Author: Wenchen Fan <cloud0fan@outlook.com> Closes #7312 from cloud-fan/minor and squashes the following commits: a4589fa [Wenchen Fan] use double not decimal when cast double and float to timestamp
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala18
1 files changed, 6 insertions, 12 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala
index 567feca713..7f2383dedc 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala
@@ -192,23 +192,18 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression w
buildCast[Decimal](_, d => decimalToTimestamp(d))
// TimestampWritable.doubleToTimestamp
case DoubleType =>
- buildCast[Double](_, d => try {
- decimalToTimestamp(Decimal(d))
- } catch {
- case _: NumberFormatException => null
- })
+ buildCast[Double](_, d => doubleToTimestamp(d))
// TimestampWritable.floatToTimestamp
case FloatType =>
- buildCast[Float](_, f => try {
- decimalToTimestamp(Decimal(f))
- } catch {
- case _: NumberFormatException => null
- })
+ buildCast[Float](_, f => doubleToTimestamp(f.toDouble))
}
private[this] def decimalToTimestamp(d: Decimal): Long = {
(d.toBigDecimal * 1000000L).longValue()
}
+ private[this] def doubleToTimestamp(d: Double): Any = {
+ if (d.isNaN || d.isInfinite) null else (d * 1000000L).toLong
+ }
// converting milliseconds to us
private[this] def longToTimestamp(t: Long): Long = t * 1000L
@@ -396,8 +391,7 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression w
buildCast[InternalRow](_, row => {
var i = 0
while (i < row.length) {
- val v = row(i)
- newRow.update(i, if (v == null) null else casts(i)(v))
+ newRow.update(i, if (row.isNullAt(i)) null else casts(i)(row(i)))
i += 1
}
newRow.copy()