Разбор Protobuf ByteString в Spark не работает после создания Encoder - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь проанализировать данные protobuf (protobuf3) в spark 2.4, и у меня возникли некоторые проблемы с типом ByteString. Я создал класс case, используя библиотеку ScalaPB, и загрузил jar в оболочку spark. Я также попытался создать неявный кодировщик для типа, однако я все еще получаю следующую ошибку:

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(_))

Любая помощь приветствуется

1 Ответ

0 голосов
/ 04 ноября 2019

Эта проблема была исправлена ​​в sparksql-scalapb 0.9.0. Пожалуйста, смотрите обновленную документацию по настройке импорта, чтобы Encoder для ByteString было выбрано неявным поиском.

...