簡體   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