Skip to content

Instantly share code, notes, and snippets.

@raronson
Created March 3, 2014 11:36
Show Gist options
  • Save raronson/9323255 to your computer and use it in GitHub Desktop.
Save raronson/9323255 to your computer and use it in GitHub Desktop.
spec to replicate java.lang.ClassCastException: scalaz.$minus$bslash$div cannot be cast to java.lang.String
package com.ambiata.ivory.scoobi
import org.specs2._
import com.nicta.scoobi.Scoobi._
import com.nicta.scoobi.testing.mutable._
import com.nicta.scoobi.testing.SimpleJobs
import com.nicta.scoobi.testing.TestFiles._
import com.nicta.scoobi.testing.TempFiles
import scalaz.{DList => _, _}, Scalaz._
object ScalazWireFormats {
import java.io._
implicit def ValidationFmt[A, B](implicit awf: WireFormat[A], bwf: WireFormat[B]) = new WireFormat[Validation[A, B]] {
def toWire(v: Validation[A, B], out: DataOutput) = {
v match {
case Failure(a) => { out.writeBoolean(false); awf.toWire(a, out) }
case Success(b) => { out.writeBoolean(true); bwf.toWire(b, out) }
}
}
def fromWire(in: DataInput): Validation[A, B] = {
in.readBoolean match {
case false => awf.fromWire(in).failure
case true => bwf.fromWire(in).success
}
}
def show(v: Validation[A, B]): String = v.toString
}
implicit def DisjunctionFmt[A, B](implicit wf: WireFormat[Either[A, B]]) = new WireFormat[A \/ B] {
def toWire(v: A \/ B, out: DataOutput) = wf.toWire(v.toEither, out)
def fromWire(in: DataInput): A \/ B = wf.fromWire(in).disjunction
def show(v: A \/ B): String = v.toString
}
}
/**
* Run with -- scoobi verbose.all to see class cast exception
*/
class BugSpec extends HadoopSpecification with SimpleJobs {
import ScalazWireFormats._
"Should not get class cast exception" >> { implicit sc: ScoobiConfiguration =>
val dlist: DList[String \/ Int] = DList("test".left, 1.right)
val lefts: DList[String] = dlist.collect {
case -\/(l) => l
}
val rights: DList[Int] = dlist.collect {
case \/-(r) => r
}
val other: DList[String \/ Int] = rights.map(_.toString.left)
val otherLefts = other collect {
case -\/(l) => l
}
val all = (lefts ++ otherLefts)
val len = all.length
persist(len, all.toTextFile(path(TempFiles.createTempDir("bug").getPath)))
len.run must_== 2
}
}
@raronson
Copy link
Author

raronson commented Mar 3, 2014

stack trace:
java.lang.ClassCastException: scalaz.$minus$bslash$div cannot be cast to java.lang.String>java.lang.Exception: java.lang.ClassCastException: scalaz.$minus$bslash$div cannot be cast to java.lang.String
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
Caused by: java.lang.ClassCastException: scalaz.$minus$bslash$div cannot be cast to java.lang.String
at com.nicta.scoobi.core.WireFormatImplicits$StringWireFormat.toWire(WireFormat.scala:340)
at com.nicta.scoobi.impl.rtt.MetadataTaggedWritable$class.write(Tagged.scala:69)
at com.nicta.scoobi.impl.rtt.MetadataTaggedValue.write(TaggedValue.scala:39)
at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:98)
at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:82)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1135)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)
at com.nicta.scoobi.core.InputOutputContext.write(DataSource.scala:127)
at com.nicta.scoobi.impl.plan.mscr.GbkInputChannel$$anon$1.write(InputChannel.scala:277)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$emitValues$1$1$$anonfun$apply$5.apply(InputChannel.scala:209)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$emitValues$1$1$$anonfun$apply$5.apply(InputChannel.scala:209)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$emitValues$1$1.apply(InputChannel.scala:209)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$emitValues$1$1.apply(InputChannel.scala:208)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$class.emitValues$1(InputChannel.scala:208)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$computeNext$1$1.apply(InputChannel.scala:203)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$$anonfun$computeNext$1$1.apply(InputChannel.scala:201)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$class.computeNext$1(InputChannel.scala:201)
at com.nicta.scoobi.impl.plan.mscr.MscrInputChannel$class.map(InputChannel.scala:198)
at com.nicta.scoobi.impl.plan.mscr.GbkInputChannel.map(InputChannel.scala:242)
at com.nicta.scoobi.impl.mapreducer.MscrMapper$$anonfun$map$1.apply(MscrMapper.scala:94)
at com.nicta.scoobi.impl.mapreducer.MscrMapper$$anonfun$map$1.apply(MscrMapper.scala:94)
at scala.collection.immutable.List.foreach(List.scala:318)
at com.nicta.scoobi.impl.mapreducer.MscrMapper.map(MscrMapper.scala:94)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:235)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)

@laurencer
Copy link

I just ran into this bug - did you ever find a fix for it?

@ChongTang
Copy link

Same here. Did you find a fix?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment