繁体   English   中英

sparcpb UDF 编译给出“错误:找不到类型为 frameless.TypedEncoder[Array[Byte]] 的证据参数的隐式值”

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

无法从导入中隐藏 Scala Class

关于隐式解析的 NullPointerException

构造一个可重写的隐式

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

Scala 如果 def 名称是 toString,则隐式 def 不起作用

Scala 中是否有针对此格式参数的解决方法?

请检查这是否有帮助。

可能的问题可能是您不想只取消导入spark.implicits._ ( scalapb.spark.Implicits._ ),您可能还想导入scalapb.spark.ProtoSQL.implicits._ 而且我不知道implicitShadowing._是否也隐藏了其中的一些。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM