用于kafka avro解码器消息的spark数据集编码器

时间:2017-11-06 09:09:17

标签: apache-kafka spark-streaming avro

导入spark.implicits._   val ds1 = spark     .readStream     .format("卡夫卡&#34)     .option(" kafka.bootstrap.servers"," localhost:9092")     .option("订阅","测试")     .option(" startingOffsets"," latest")     。加载()     。如[KafkaMessage]     。选择($"值"。作为[阵列[字节]])     .MAP(MSG => {

  val byteArrayInputStream = new ByteArrayInputStream(msg)
  val datumReader:DatumReader[GenericRecord] = new SpecificDatumReader[GenericRecord](messageSchema)
  val dataFileReader:DataFileStream[GenericRecord]  = new DataFileStream[GenericRecord](byteArrayInputStream, datumReader)

  while(dataFileReader.hasNext) {
    val userData1: GenericRecord = dataFileReader.next()

    userData1.asInstanceOf[org.apache.avro.util.Utf8].toString
  }
})

错误: 错误:(49,9)无法找到存储在数据集中的类型的编码器。导入spark.implicits支持原始类型(Int,String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。     .MAP(MSG => {

1 个答案:

答案 0 :(得分:1)

每当您尝试在结构化流媒体中对数据集进行地图/转换时,都希望与适当的编码器相关联。

Tor原始数据类型,隐式编码器由spark:

提供
import spark.implicits._

您需要手动提供的其他类型。

所以在这里你可以使用隐式编码器:

import scala.reflect.ClassTag

implicit def kryoEncoder[A](implicit ct: ClassTag[A]) = org.apache.spark.sql.Encoders.kryo[A](ct)

...或者您可以定义与地图功能中正在处理的数据相关联的编码器。