【发布时间】:2017-04-04 00:10:30
【问题描述】:
我有一个 spark 2.0 应用程序,它使用 spark 流(使用 spark-streaming-kafka-0-10_2.11)从 kafka 读取消息。
结构化流看起来很酷,所以我想尝试迁移代码,但我不知道如何使用它。
在常规流中,我使用 kafkaUtils 创建 Dstrean,在我传递的参数中,它是值反序列化器。
在结构化流中,文档说我应该使用 DataFrame 函数进行反序列化,但我无法准确理解这意味着什么。
我查看了诸如 example 之类的示例,但我在 Kafka 中的 Avro 对象非常复杂,不能像示例中的字符串那样简单地转换......
到目前为止,我尝试过这种代码(我在另一个问题中看到过):
import spark.implicits._
val ds1 = spark.readStream.format("kafka").
option("kafka.bootstrap.servers","localhost:9092").
option("subscribe","RED-test-tal4").load()
ds1.printSchema()
ds1.select("value").printSchema()
val ds2 = ds1.select($"value".cast(getDfSchemaFromAvroSchema(Obj.getClassSchema))).show()
val query = ds2.writeStream
.outputMode("append")
.format("console")
.start()
我得到“数据类型不匹配:无法将 BinaryType 转换为 StructType(StructField(....”
如何反序列化该值?
【问题讨论】:
-
有人找到可行的解决方案了吗?以下都不适合我!
-
这个库支持使用 Avro 作为有效负载的结构化流,可能会有所帮助:ABRiS (Avro Bridge for Spark)。它仍在开发中,但支持您的用例。披露:我为 ABSA 工作,我是这个库背后的主要开发人员。
标签: scala apache-kafka spark-streaming avro apache-spark-2.0