Scala 偏函数计算器
Scala PartialFunction Stackoverflow
我正在开发一个名为 PySpark Cassandra 的 Scala / Python 库。在其中,我必须处理 pickle 格式的对象序列化 Python 对象,例如正在保存数据。
我的工作因 stackoverlfow 而失败:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 250 in stage 2.0 failed 4 times, most recent failure: Lost task 250.3 in stage 2.0 (TID 411, sp-prod-adg02.priv.tgho.nl): java.lang.WhosebugError
at pyspark_cassandra.UnpickledUUIDConverter$$anonfun$convertPF.applyOrElse(Pickling.scala:121)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:165)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
...
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
启动此跟踪的代码是:
object UnpickledUUIDConverter extends TypeConverter[UUID] {
val tt = typeTag[UUID]
def targetTypeTag = tt
def convertPF = { case holder: UUIDHolder => holder.uuid }
}
位于 https://github.com/TargetHolding/pyspark-cassandra/blob/master/src/main/scala/pyspark_cassandra/Pickling.scala#L118(更多详细信息和上下文)。
UUIDHolder class 定义为:
class UUIDHolder {
var uuid: UUID = null
def __setstate__(values: HashMap[String, Object]): UUID = {
val i = values.get("int").asInstanceOf[BigInteger]
val buffer = ByteBuffer.wrap(i.toByteArray())
uuid = new UUID(buffer.getLong(), buffer.getLong())
uuid
}
}
(这个 class 的奇怪构造是为了与 py4j 兼容以及 Python 如何腌制 UUID 对象)
但是我对 Scala 以及 case 块和 PartialFunctions 之间的关系的理解是相当有限的。特别是我的 case 块与 https://github.com/scala/scala/blob/2.10.x/src/library/scala/PartialFunction.scala#L166 的关系(我在 Scala 2.10.5 上是 运行)
让我的情况更糟 :) 我很难始终如一地重现错误。它发生在不同节点上的 Spark 作业中,但并非总是如此。我有一个数据集,在保存该数据集时存在问题。但我无法将其固定到数据集中的特定记录。
在任何情况下,我都不希望使用此代码出现 Whosebug。非常感谢任何帮助!
我正在开发一个名为 PySpark Cassandra 的 Scala / Python 库。在其中,我必须处理 pickle 格式的对象序列化 Python 对象,例如正在保存数据。
我的工作因 stackoverlfow 而失败:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 250 in stage 2.0 failed 4 times, most recent failure: Lost task 250.3 in stage 2.0 (TID 411, sp-prod-adg02.priv.tgho.nl): java.lang.WhosebugError
at pyspark_cassandra.UnpickledUUIDConverter$$anonfun$convertPF.applyOrElse(Pickling.scala:121)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:165)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
...
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:166)
启动此跟踪的代码是:
object UnpickledUUIDConverter extends TypeConverter[UUID] {
val tt = typeTag[UUID]
def targetTypeTag = tt
def convertPF = { case holder: UUIDHolder => holder.uuid }
}
位于 https://github.com/TargetHolding/pyspark-cassandra/blob/master/src/main/scala/pyspark_cassandra/Pickling.scala#L118(更多详细信息和上下文)。
UUIDHolder class 定义为:
class UUIDHolder {
var uuid: UUID = null
def __setstate__(values: HashMap[String, Object]): UUID = {
val i = values.get("int").asInstanceOf[BigInteger]
val buffer = ByteBuffer.wrap(i.toByteArray())
uuid = new UUID(buffer.getLong(), buffer.getLong())
uuid
}
}
(这个 class 的奇怪构造是为了与 py4j 兼容以及 Python 如何腌制 UUID 对象)
但是我对 Scala 以及 case 块和 PartialFunctions 之间的关系的理解是相当有限的。特别是我的 case 块与 https://github.com/scala/scala/blob/2.10.x/src/library/scala/PartialFunction.scala#L166 的关系(我在 Scala 2.10.5 上是 运行)
让我的情况更糟 :) 我很难始终如一地重现错误。它发生在不同节点上的 Spark 作业中,但并非总是如此。我有一个数据集,在保存该数据集时存在问题。但我无法将其固定到数据集中的特定记录。
在任何情况下,我都不希望使用此代码出现 Whosebug。非常感谢任何帮助!