works perfectly! Thanks Herman. Am Di., 25. Aug. 2020 um 12:03 Uhr schrieb Herman van Hovell < her...@databricks.com>:
> Hi Robert, > > Your Spark 3.0 code is missing the encoder that converts the Row to an > InternalRow. Your Spark 3.0 code should look like this: > > def rowToCaseClass[C <: Product : TypeTag](r: Row)(implicit encs: > (ExpressionEncoder[Row], ExpressionEncoder[C])): C = { > val serializer = encs._1.createSerializer() > val deserializer = encs._2.createDeserializer() > deserializer(serializer(r)) > } > > I would recommend you create the serializer and deserializer pair once per > thread. > > Kind regards, > Herman > > On Tue, Aug 25, 2020 at 11:35 AM Robert Berke <berke.rob...@gmail.com> > wrote: > >> Hi everyone >> >> Thanks Takeshi. I run into the same issue as Mark for my row to case >> class converter: >> >> def rowToCaseClass[C <: Product : TypeTag](r: Row)(implicit encs: >> (ExpressionEncoder[Row], ExpressionEncoder[C])): C = { >> >> val ir = encs._1.toRow(r) >> encs._2.fromRow(ir) >> >> } >> >> So in Spark3.0 I would do: >> >> def rowToCaseClass[C <: Product : TypeTag](r: Row)(implicit enc: >> ExpressionEncoder[C]): C = enc.createDeserializer()(InternalRow(r)) >> >> Unfortunately this yields the following error below when calling >> >> val r: Row = Row(1.0,2000L) >> case class C(d: Double, l: Long) >> >> implicit val enc: ExpressionEncoder[C] = >> Encoders.product[C].asInstanceOf[ExpressionEncoder[C]].resolveAndBind() >> >> >> rowToCaseClass[C](r) >> >> >> >> Cheers, Robert >> >> >> Caused by: java.lang.RuntimeException: Error while decoding: >> java.lang.ClassCastException: >> org.apache.spark.sql.catalyst.expressions.GenericRow cannot be cast to >> java.lang.Double newInstance(class >> line58c8cc5e7d9841e5b85d34e76c692e7d31.$read$$iw$$iw$$iw$$iw$$iw$$iw$C) at >> org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$Deserializer.apply(ExpressionEncoder.scala:201) >> at io.beprop.spark.common.package$.rowToCaseClass(package.scala:132) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw$$iw$$iw$$iw$$iw$$iw.<init>( >> command-503321:1) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw$$iw$$iw$$iw$$iw.<init>( >> command-503321:50) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw$$iw$$iw$$iw.<init>( >> command-503321:52) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw$$iw$$iw.<init>( >> command-503321:54) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw$$iw.<init>( >> command-503321:56) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$$iw.<init>(command-503321:58) >> at line58c8cc5e7d9841e5b85d34e76c692e7d35.$read.<init>(command-503321:60) >> at line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$.<init>(command-503321:64) >> at line58c8cc5e7d9841e5b85d34e76c692e7d35.$read$.<clinit>(command-503321) >> at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$eval$.$print$lzycompute(<notebook>:7) >> at line58c8cc5e7d9841e5b85d34e76c692e7d35.$eval$.$print(<notebook>:6) at >> line58c8cc5e7d9841e5b85d34e76c692e7d35.$eval.$print(<notebook>) at >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:498) at >> scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:745) at >> scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1021) at >> scala.tools.nsc.interpreter.IMain.$anonfun$interpret$1(IMain.scala:574) at >> scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:41) >> at >> scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:37) >> at >> scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:41) >> at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573) at >> scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:600) at >> scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:570) at >> com.databricks.backend.daemon.driver.DriverILoop.execute(DriverILoop.scala:219) >> at >> com.databricks.backend.daemon.driver.ScalaDriverLocal.$anonfun$repl$1(ScalaDriverLocal.scala:204) >> at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) >> at >> com.databricks.backend.daemon.driver.DriverLocal$TrapExitInternal$.trapExit(DriverLocal.scala:769) >> at >> com.databricks.backend.daemon.driver.DriverLocal$TrapExit$.apply(DriverLocal.scala:722) >> at >> com.databricks.backend.daemon.driver.ScalaDriverLocal.repl(ScalaDriverLocal.scala:204) >> at >> com.databricks.backend.daemon.driver.DriverLocal.$anonfun$execute$10(DriverLocal.scala:431) >> at >> com.databricks.logging.UsageLogging.$anonfun$withAttributionContext$1(UsageLogging.scala:237) >> at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62) at >> com.databricks.logging.UsageLogging.withAttributionContext(UsageLogging.scala:232) >> at >> com.databricks.logging.UsageLogging.withAttributionContext$(UsageLogging.scala:229) >> at >> com.databricks.backend.daemon.driver.DriverLocal.withAttributionContext(DriverLocal.scala:48) >> at >> com.databricks.logging.UsageLogging.withAttributionTags(UsageLogging.scala:274) >> at >> com.databricks.logging.UsageLogging.withAttributionTags$(UsageLogging.scala:267) >> at >> com.databricks.backend.daemon.driver.DriverLocal.withAttributionTags(DriverLocal.scala:48) >> at >> com.databricks.backend.daemon.driver.DriverLocal.execute(DriverLocal.scala:408) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.$anonfun$tryExecutingCommand$1(DriverWrapper.scala:653) >> at scala.util.Try$.apply(Try.scala:213) at >> com.databricks.backend.daemon.driver.DriverWrapper.tryExecutingCommand(DriverWrapper.scala:645) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.getCommandOutputAndError(DriverWrapper.scala:486) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.executeCommand(DriverWrapper.scala:598) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.runInnerLoop(DriverWrapper.scala:391) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.runInner(DriverWrapper.scala:337) >> at >> com.databricks.backend.daemon.driver.DriverWrapper.run(DriverWrapper.scala:219) >> at java.lang.Thread.run(Thread.java:748) Caused by: >> java.lang.ClassCastException: >> org.apache.spark.sql.catalyst.expressions.GenericRow cannot be cast to >> java.lang.Double at >> scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:116) at >> org.apache.spark.sql.catalyst.expressions.BaseGenericInternalRow.getDouble(rows.scala:44) >> at >> org.apache.spark.sql.catalyst.expressions.BaseGenericInternalRow.getDouble$(rows.scala:44) >> at >> org.apache.spark.sql.catalyst.expressions.GenericInternalRow.getDouble(rows.scala:195) >> >> >> >> >> Am Mo., 24. Aug. 2020 um 03:05 Uhr schrieb Takeshi Yamamuro < >> linguin....@gmail.com>: >> >>> Hi, >>> >>> Have you tried it like this? >>> >>> ------ >>> { r: InternalRow => enc1.fromRow(r) } >>> >>> ===> >>> >>> { r: InternalRow => >>> val fromRow = enc1.createDeserializer() >>> fromRow(r) >>> } >>> >>> >>> https://github.com/apache/spark/commit/e7fef70fbbea08a38316abdaa9445123bb8c39e2 >>> >>> Bests, >>> Takeshi >>> >>> On Thu, Aug 20, 2020 at 1:52 PM Mark Hamilton >>> <marha...@microsoft.com.invalid> wrote: >>> >>>> Dear Spark Developers, >>>> >>>> >>>> >>>> In our teams Spark Library <http://aka.ms/mmlspark> we utilize >>>> ExpressionEncoders to help us automatically generate spark SQL types from >>>> scala case classes. >>>> >>>> >>>> >>>> >>>> https://github.com/Azure/mmlspark/blob/master/src/main/scala/com/microsoft/ml/spark/core/schema/SparkBindings.scala >>>> >>>> >>>> >>>> However it seems in 3.0 the ability to get types from internal rows and >>>> rows has been removed. Is there any guidance on how to get similar behavior >>>> in 3.0? Thanks for your help! >>>> >>>> >>>> >>>> Best, >>>> >>>> Mark >>>> >>> >>> >>> -- >>> --- >>> Takeshi Yamamuro >>> >>