[英]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.