sparkpb UDF 编译给出"error: could not find implicit value for evidence parameter of type frameless.Typed



我是scala新手,广泛使用pyspark(在DataBricks, FWIW上)。我发现在python中Protobuf反序列化对我来说太慢了,所以我将我的反序列化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]

this does not:

frameless.TypedEncoder[Array[Byte]]

frameless.TypedEncoder的代码似乎包括一个通用的Array编码器,但我不确定我是否正确阅读它。

@Dymtro,谢谢你的建议。帮助。有人知道这是怎么回事吗?

更新好的,进度-这看起来像一个DataBricks问题。我认为笔记本在启动时做了如下的事情:

import spark.implicits._

我用的是scalapb,它要求你不要这样做

我正在寻找一种方法来禁用自动导入,或者"unimport";或";shadow"这些模块被导入后。

如果spark.implicits._已经导入,则有方法"unimport";(隐藏或隐藏它们)是创建一个重复的对象并导入它

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 repl中取消隐式导入?

无法隐藏导入Scala类

NullPointerException的隐式解析

构造可重写的隐式

缓存循环隐式解析的编码器/解码器实例

Scala隐式def不起作用,如果def name是toString

在Scala中是否有解决这个格式参数的方法?

请检查是否有帮助。

可能的问题是,您不希望仅仅取消导入spark.implicits._(scalapb.spark.Implicits._),您可能也想导入scalapb.spark.ProtoSQL.implicits._。我不知道implicitShadowing._是否也会给他们中的一些人阴影。

另一个可能的解决方法是手动解析隐式并显式地使用它们。

最新更新