如何访问InputDStream数据?

时间:2015-12-03 13:57:51

标签: scala apache-spark bigdata apache-kafka

我对scala和spark很新。我将来自kafka(真实)的字符串消息发送到spark(本地),但是如何访问它们?例如,我想要一个包含所有消息的字符串列表。我最后只打印了它们:

val sc = new SparkContext(conf)
val ssc =  new StreamingContext(sc, Seconds(1))
val directKafkaStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder ](ssc, kafkaParams, Set[String]("testTopic"))
directKafkaStream.print() //I can see it in console, but how to get my message string? 

1 个答案:

答案 0 :(得分:1)

正如您在API中看到的,InputDStream是DStream的子类。这意味着您可以像访问DStream一样访问InputDStream。

您可以通过迭代RDD来“获取”您的消息字符串,例如:

directKafkaStream.foreachRDD { rdd => 
  rdd.foreach { content => 
    // code to handle the string here
  }
}

通常,它取决于您期望的类型(例如,自定义Avro记录),但在您处理字符串的情况下,将rdd视为字符串[s]的集合应该足够了。

理论上,如果要应用转换(例如filter,...),您甚至不需要使用单独的.foreachRDD迭代RDD。例如,如果要过滤包含特定单词的所有字符串,可以使用:

val infoLines = directKafkaStream.filter { line =>
  line.contains("INFO")
}

请注意,infoLines仍会返回DStream[String],因此您仍会遇到相同的初始问题:如何访问单个字符串?您需要了解DStreams和RDD是Spark和Spark Streaming使用的高级数据抽象 - 通常您将首先对具有转换的那些进行操作,然后您将应用操作(例如,saveAsTextFile) - 很少是println语句。 / p>

然而,从您的问题来看,似乎您需要阅读一些关于Spark Streaming的文档:official documentation是一个很好的资源(虽然有些书籍,例如Learning Spark,也可能帮助您理解)。 / p>