我正在尝试解析 spark 2.4 中的 protobuf (protobuf3) 数据,但 ByteString 类型遇到了一些问题。我使用 ScalaPB 库创建了案例类,并将 jar 加载到 spark shell 中。我也尝试为该类型创建一个隐式编码器,但是我仍然收到以下错误;
java.lang.UnsupportedOperationException: No Encoder found for com.google.protobuf.ByteString
到目前为止,这是我尝试过的;
import proto.Event._ // my proto case class
import org.apache.spark.sql.Encoder
import org.apache.spark.sql.Encoders.kryo
// Register our UDTs to avoid "<none> is not a term" error:
EventProtoUdt.register()
val inputFile = "data.avro"
object ByteStringEncoder{
implicit def byteStringEncoder: Encoder[com.google.protobuf.ByteString] = org.apache.spark.sql.Encoders.kryo[com.google.protobuf.ByteString]
}
import ByteStringEncoder._
import spark.implicits._
def parseLine(s: String): Event= Event.parseFrom(org.apache.commons.codec.binary.Base64.decodeBase64(s))
import scalapb.spark._
val eventsDf = spark.read.format("avro").load(inputFile)
val eventsDf2 = eventsDf .map(row => row.getAs[Array[Byte]]("Body")).map(Event.parseFrom(_))
任何帮助表示赞赏