Skip to content

Commit 6eae7b1

Browse files
committed
TypeTags are not kryo serializable by default, rearrange implicits to address this issue
1 parent b1c60ed commit 6eae7b1

3 files changed

Lines changed: 27 additions & 7 deletions

File tree

core/src/main/scala/com/azavea/hiveless/serializers/HSerializer.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ object HSerializer extends Serializable {
5555
// format: off
5656
/**
5757
* Derive HSerializer from ExpressionEncoder.
58-
* Intentionally not used for instances implementation, causes the following failure on DataBricks:
58+
* Intentionally not used for instances implementation, causes the following failure on DataBricks;
59+
* TypeTags are not Kryo serializable by default:
5960
* org.apache.spark.SparkException: Job aborted due to stage failure: Task serialization failed: com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
6061
* Serialization trace:
6162
* classes (sun.misc.Launcher$AppClassLoader)

core/src/main/scala/com/azavea/hiveless/serializers/UnaryDeserializer.scala

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,29 @@ object UnaryDeserializer extends Serializable {
5151
implicit def tryUnaryDeserializer[T: UnaryDeserializer[Id, *]]: UnaryDeserializer[Try, T] =
5252
(arguments, inspectors) => Try(id[T].deserialize(arguments, inspectors))
5353

54-
/** Derive Optional UnaryDeserializers. */
5554
implicit def optionalUnaryDeserializer[T: UnaryDeserializer[Id, *]]: UnaryDeserializer[Id, Option[T]] =
5655
(arguments, inspectors) => (arguments.headOption, inspectors.headOption).mapN(id[T].deserialize)
5756

58-
/** Derive UnaryDeserializers from ExpressionEncoders. */
59-
implicit def expressionEncoderUnaryDeserializer[T: TypeTag: ExpressionEncoder]: UnaryDeserializer[Id, T] =
57+
// format: off
58+
/**
59+
* Derive UnaryDeserializers from ExpressionEncoders.
60+
* Intentionally not used for instances implementation, causes the following failure on DataBricks;
61+
* TypeTags are not Kryo serializable by default:
62+
* org.apache.spark.SparkException: Job aborted due to stage failure: Task serialization failed: com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
63+
* Serialization trace:
64+
* classes (sun.misc.Launcher$AppClassLoader)
65+
* classloader (java.security.ProtectionDomain)
66+
* context (java.security.AccessControlContext)
67+
* acc (com.databricks.backend.daemon.driver.ClassLoaders$LibraryClassLoader)
68+
* classLoader (scala.reflect.runtime.JavaMirrors$JavaMirror)
69+
* mirror (scala.reflect.api.TypeTags$TypeTagImpl)
70+
* evidence$3$1 (com.azavea.hiveless.serializers.UnaryDeserializer$$anonfun$expressionEncoderUnaryDeserializer$2)
71+
* evidence$1$1 (com.azavea.hiveless.serializers.UnaryDeserializer$$anonfun$tryUnaryDeserializer$3)
72+
* dh$1 (com.azavea.hiveless.serializers.GenericDeserializer$$anon$4)
73+
* d$2 (com.azavea.hiveless.serializers.GenericDeserializer$$anon$2)
74+
*/
75+
// format: on
76+
def expressionEncoderUnaryDeserializer[T: TypeTag: ExpressionEncoder]: UnaryDeserializer[Id, T] =
6077
(arguments, inspectors) => arguments.deserialize[InternalRow](inspectors).as[T]
6178

6279
/** Derivation helper deserializer. */

spatial-index/src/main/scala/com/azavea/hiveless/spatial/index/package.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ package object index extends StandardEncoders {
4040
def serialize: CRS => Any = crs => crs.toProj4String.serialize
4141
}
4242

43-
/**
44-
* HSerializer.expressionEncoderSerializer causes serialization issues on DataBricks. TODO: investigate this issue.
45-
*/
43+
/** HSerializer.expressionEncoderSerializer is not used since TypeTags are not Kryo serializable by default. */
4644
implicit def extentSerializer: HSerializer[Extent] = new HSerializer[Extent] {
4745
def dataType: DataType = extentEncoder.schema
4846
def serialize: Extent => InternalRow = _.toInternalRow
@@ -52,4 +50,8 @@ package object index extends StandardEncoders {
5250
def dataType: DataType = z2IndexEncoder.schema
5351
def serialize: Z2Index => InternalRow = _.toInternalRow
5452
}
53+
54+
/** UnaryDeserializer.expressionEncoderUnaryDeserializer since TypeTags are not Kryo serializable by default. */
55+
implicit def extentUnaryDeserializer: UnaryDeserializer[Id, Extent] =
56+
(arguments, inspectors) => arguments.deserialize[InternalRow](inspectors).as[Extent]
5557
}

0 commit comments

Comments
 (0)