SparkStreaming:DirectStream RDD到数据帧

时间:2018-09-17 12:22:38

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

我正在研究Spark Streaming上下文,它正在以如下方式在avro序列化中从kafka主题获取数据。

val kafkaParams = Map[String, Object](
  "bootstrap.servers" -> "localhost:9092",
  "schema.registry.url" -> "http://localhost:8081",
  "key.deserializer" -> "io.confluent.kafka.serializers.KafkaAvroDeserializer",
  "value.deserializer" -> "io.confluent.kafka.serializers.KafkaAvroDeserializer",
  "group.id" -> "1"
)

我使用Kafka实用工具创建如下的直接流

val topics = Set("mysql-foobar")


val stream = KafkaUtils.createDirectStream[String, String](
  ssc,
  PreferConsistent,
  Subscribe[String,String](
    topics,
    kafkaParams)
)

我也将数据写入

到控制台
stream.foreachRDD ( rdd => {
  rdd.foreachPartition(iterator => {
    while (iterator.hasNext) {
      val next = iterator.next()
      println(next.value())
    }
  })
})

现在我想从这些RDD创建数据帧。我是否可能已经检查并测试了stackoverflow的许多解决方案,但是却遇到了一些问题。 Stackoverflow解决方案还有thisthis。 我的输出如下所示

{"c1": 4, "c2": "Jarry", "create_ts": 1536758512000, "update_ts": 1537204805000}

1 个答案:

答案 0 :(得分:1)

由于您使用的是Confluent序列化器,并且此时它们还不能与Spark轻松集成,因此您可以在AbthOSS的Github上签出一个相对较新的库,以帮助解决此问题。

但是,基本上,您使用Spark结构化流来获取DataFrame,不要尝试使用Dstream将RDD转换为Dataframe ...

您可以找到examples of what you're looking for here

另请参见Integrating Spark Structured Streaming with the Kafka Schema Registry

上的其他示例