我正在使用scala&使用以下Spark Streaming方法从Kafka消费数据:
val lines = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics).map(_._2)
上面的变量返回InputDStream,通过它我可以使用下面的代码以原始/二进制格式查看数据: 的println(线)
但我需要在原始/二进制格式上应用avro格式(架构可用),以便以预期的json格式查看数据。为了应用avro格式,我需要将上面的InputDStream转换为avro使用的Array [Bytes]。
有人可以让我知道将InputDStream转换为Array [Bytes]吗?
或
如果您知道在InputDStream(spark Streaming)上应用avro架构的更好方法,请分享。
答案 0 :(得分:2)
您需要做两件事。第一个是使用DefaultDecoder
用于Kafka,它为值类型提供Array[Byte]
:
val lines: DStream[(String, Array[Byte])] =
KafkaUtils
.createDirectStream[String, Array[Byte], StringDecoder, DefaultDecoder](ssc, kafkaParams, topics)
然后您需要通过额外的map
应用您的Avro反序列化逻辑:
lines.map { case (_, bytes) => avroDeserializer.deserialize(bytes) }
其中avroDeserializer
是您的任意类,它知道如何从Avro字节创建类型。
我个人使用avro4s通过宏来获取案例类反序列化。