aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2016-09-28 14:19:26 -0700
committerJakob Odersky <jakob@odersky.com>2016-09-28 14:48:52 -0700
commita3dce9f5f9ced492fa6f20b93497856fd51fc757 (patch)
tree80c68fb70479fe68c12d06d462891ede459240f3
parent46d1203bf2d01b219c4efc7e0e77a844c0c664da (diff)
downloadspark-value-classes.tar.gz
spark-value-classes.tar.bz2
spark-value-classes.zip
Add support for value class serialization and deserializationvalue-classes
Value classes were unsupported because catalyst data types were obtained through reflection on erased types, which would resolve to a value class' wrapped type and hence lead to unavailable methods during code generation. This patch simply removes the erasure step when getting data types for catalyst.
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala2
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala14
2 files changed, 13 insertions, 3 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
index 7923cfce82..31c6e5def1 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ScalaReflection.scala
@@ -628,7 +628,7 @@ object ScalaReflection extends ScalaReflection {
/*
* Retrieves the runtime class corresponding to the provided type.
*/
- def getClassFromType(tpe: Type): Class[_] = mirror.runtimeClass(tpe.erasure.typeSymbol.asClass)
+ def getClassFromType(tpe: Type): Class[_] = mirror.runtimeClass(tpe.typeSymbol.asClass)
case class Schema(dataType: DataType, nullable: Boolean)
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala
index 4df9062018..4d896c2e38 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala
@@ -66,8 +66,6 @@ case class RepeatedData(
mapFieldNull: scala.collection.Map[Int, java.lang.Long],
structField: PrimitiveData)
-case class SpecificCollection(l: List[Int])
-
/** For testing Kryo serialization based encoder. */
class KryoSerializable(val value: Int) {
override def hashCode(): Int = value
@@ -107,6 +105,12 @@ class UDTForCaseClass extends UserDefinedType[UDTCaseClass] {
}
}
+case class PrimitiveValueClass(wrapped: Int) extends AnyVal
+case class ReferenceValueClass(wrapped: ReferenceValueClass.Container) extends AnyVal
+object ReferenceValueClass {
+ case class Container(data: Int)
+}
+
class ExpressionEncoderSuite extends PlanTest with AnalysisTest {
OuterScopes.addOuterScope(this)
@@ -290,6 +294,12 @@ class ExpressionEncoderSuite extends PlanTest with AnalysisTest {
ExpressionEncoder.tuple(intEnc, ExpressionEncoder.tuple(intEnc, longEnc))
}
+ encodeDecodeTest(
+ PrimitiveValueClass(42), "primitive value class")
+
+ encodeDecodeTest(
+ ReferenceValueClass(ReferenceValueClass.Container(1)), "reference value class")
+
productTest(("UDT", new ExamplePoint(0.1, 0.2)))
test("nullable of encoder schema") {