0

我正在尝试解析 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(_))

任何帮助表示赞赏

4

1 回答 1

0

此问题已在 sparksql-scalapb 0.9.0 中修复。请参阅有关设置导入的更新文档Encoder,以便通过隐式搜索获取 for ByteString。

于 2019-11-04T04:28:32.100 回答