【问题标题】:Parsing Protobuf ByteString in Spark not working after creating Encoder创建编码器后,在 Spark 中解析 Protobuf ByteString 不起作用
【发布时间】:2020-02-11 22:37:55
【问题描述】:

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

感谢任何帮助

【问题讨论】:

标签: scala apache-spark protocol-buffers scalapb apache-spark-encoders


【解决方案1】:

此问题已在 sparksql-scalapb 0.9.0 中修复。请参阅 the updated documentation 设置导入,以便隐式搜索获取 ByteString 的 Encoder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2023-03-16
    • 2015-05-15
    • 2016-08-22
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多