我是一个scala新手,广泛使用pyspark(在DataBricks,FWIW上),我发现在python中Protobuf反序列化对我来说太慢了,所以我把我的反序列化udf移植到scala中。
我已经将我的.proto
文件编译为scala,然后使用scalapb
编译了一个JAR,如here所述
当我尝试使用这些指令来建立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
,它要求您不要这样做
我现在正在寻找一种方法来禁用自动导入,或者在导入模块后“取消导入”或“隐藏”这些模块。
1条答案
按热度按时间g52tjvyc1#
如果已经导入了
spark.implicits._
,那么“取消导入”(隐藏或遮蔽它们)的一种方法是创建一个复制对象并将其导入case class Person(id: Long, name: String)
的测试第一个
How to override an implicit value?
Wildcard Import, then Hide Particular Implicit?
How to override an implicit value, that is imported?
How can an implicit be unimported from the Scala repl?
Not able to hide Scala Class from Import
NullPointerException on implicit resolution
Constructing an overridable implicit
Caching the circe implicitly resolved Encoder/Decoder instances
Scala implicit def do not work if the def name is toString
Is there a workaround for this format parameter in Scala?
请检查这是否有帮助。
可能的问题是,你不想仅仅取消导入
spark.implicits._
(scalapb.spark.Implicits._
),你可能也想导入scalapb.spark.ProtoSQL.implicits._
。我不知道implicitShadowing._
是否也遮蔽了其中的一些。另一种可能的解决方法是手动解决隐含问题,然后明确使用它们。