[英]Scala compile error - could not find implicit value for evidence parameter of type
[英]sparkpb UDF compile giving "error: could not find implicit value for evidence parameter of type frameless.TypedEncoder[Array[Byte]]"
我是 scala 新手,广泛使用 pyspark(在 DataBricks 上,FWIW)。 我发现 Protobuf 反序列化在 python 中对我来说太慢了,所以我将我的反序列化 udf 移植到 scala。
我已经将我的.proto
文件编译为 scala,然后使用scalapb
编译为 JAR,如此处所述
当我尝试使用这些说明创建这样的 UDF 时:
import gnmi.gnmi._
import org.apache.spark.sql.{Dataset, DataFrame, functions => F}
import spark.implicits.StringToColumn
import scalapb.spark.ProtoSQL
// import scalapb.spark.ProtoSQL.implicits._
import scalapb.spark.Implicits._
val deserialize_proto_udf = ProtoSQL.udf { bytes: Array[Byte] => SubscribeResponse.parseFrom(bytes) }
我收到以下错误:
command-4409173194576223:9: error: could not find implicit value for evidence parameter of type frameless.TypedEncoder[Array[Byte]]
val deserialize_proto_udf = ProtoSQL.udf { bytes: Array[Byte] => SubscribeResponse.parseFrom(bytes) }
我已经仔细检查过我是否正在导入正确的隐含函数,但无济于事。 一般来说,我对隐式、证据参数和 scala 非常模糊。
如果有人能指出正确的方向,我将不胜感激。 我什至不知道如何开始诊断!!!
似乎frameless
不包含Array[Byte]
的隐式编码器??? 这有效:
frameless.TypedEncoder[Byte]
这不会:
frameless.TypedEncoder[Array[Byte]]
frameless.TypedEncoder
的代码似乎包含一个通用Array
编码器,但我不确定我是否正确阅读了它。
@Dymtro,感谢您的建议。 那有帮助。
有没有人知道这里发生了什么?
好的,进展 - 这看起来像一个 DataBricks 问题。 我认为笔记本在启动时会执行以下操作:
import spark.implicits._
我正在使用scalapb
,这要求你不要那样做
我正在寻找一种方法来禁用该自动导入,或者在导入这些模块后“取消导入”或“隐藏”这些模块。
如果spark.implicits._
已经导入,那么“取消导入”(隐藏或隐藏它们)的方法是创建一个副本 object 并将其也导入
object implicitShadowing extends SQLImplicits with Serializable {
protected override def _sqlContext: SQLContext = ???
}
import implicitShadowing._
测试case class Person(id: Long, name: String)
// no import
List(Person(1, "a")).toDS() // doesn't compile, value toDS is not a member of List[Person]
import spark.implicits._
List(Person(1, "a")).toDS() // compiles
import spark.implicits._
import implicitShadowing._
List(Person(1, "a")).toDS() // doesn't compile, value toDS is not a member of List[Person]
Scala 如果 def 名称是 toString,则隐式 def 不起作用
请检查这是否有帮助。
可能的问题可能是您不想只取消导入spark.implicits._
( scalapb.spark.Implicits._
),您可能还想导入scalapb.spark.ProtoSQL.implicits._
。 而且我不知道implicitShadowing._
是否也隐藏了其中的一些。
另一种可能的解决方法是手动解析隐式并显式使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.