将Spark-kafka InputDStream转换为数组[Bytes]

时间:2017-02-13 21:19:52

标签: scala apache-spark apache-kafka spark-streaming avro

我正在使用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架构的更好方法,请分享。

1 个答案:

答案 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通过宏来获取案例类反序列化。