我是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._
是否也会给他们中的一些人阴影。
另一个可能的解决方法是手动解析隐式并显式地使用它们。