导入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 => {
答案 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)
...或者您可以定义与地图功能中正在处理的数据相关联的编码器。