aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@gmail.com>2015-03-25 17:52:23 -0700
committerMichael Armbrust <michael@databricks.com>2015-03-25 17:52:23 -0700
commit73d57754dd23d84331c10355338a4240b3ac5fee (patch)
treedcc2511fecebbb8c94d85ccd755639d15b513e9e /sql
parente6d1406abd55bc24477eb8c6ee72c31e7110435e (diff)
downloadspark-73d57754dd23d84331c10355338a4240b3ac5fee.tar.gz
spark-73d57754dd23d84331c10355338a4240b3ac5fee.tar.bz2
spark-73d57754dd23d84331c10355338a4240b3ac5fee.zip
[SPARK-6326][SQL] Improve castStruct to be faster
Current `castStruct` should be very slow. This pr slightly improves it. Author: Liang-Chi Hsieh <viirya@gmail.com> Closes #5017 from viirya/faster_caststruct and squashes the following commits: 385d5b0 [Liang-Chi Hsieh] Further improved. 746fcfb [Liang-Chi Hsieh] Make castStruct faster.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala15
1 files changed, 11 insertions, 4 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 9bde74ac22..31f1a5fdc7 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
@@ -394,10 +394,17 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression w
val casts = from.fields.zip(to.fields).map {
case (fromField, toField) => cast(fromField.dataType, toField.dataType)
}
- // TODO: This is very slow!
- buildCast[Row](_, row => Row(row.toSeq.zip(casts).map {
- case (v, cast) => if (v == null) null else cast(v)
- }: _*))
+ // TODO: Could be faster?
+ val newRow = new GenericMutableRow(from.fields.size)
+ buildCast[Row](_, row => {
+ var i = 0
+ while (i < row.length) {
+ val v = row(i)
+ newRow.update(i, if (v == null) null else casts(i)(v))
+ i += 1
+ }
+ newRow.copy()
+ })
}
private[this] def cast(from: DataType, to: DataType): Any => Any = to match {