Scala 如何访问输入流数据?

Scala 如何访问输入流数据?,scala,apache-spark,bigdata,apache-kafka,Scala,Apache Spark,Bigdata,Apache Kafka,我刚接触scala和spark。我正在从kafka(real)向spark(local)发送字符串消息,但我如何访问它们?例如,我想要一个包含所有消息的字符串列表。最后我只打印了它们: val sc = new SparkContext(conf) val ssc = new StreamingContext(sc, Seconds(1)) val directKafkaStream = KafkaUtils.createDirectStream[String, String, StringD

我刚接触scala和spark。我正在从kafka(real)向spark(local)发送字符串消息,但我如何访问它们?例如,我想要一个包含所有消息的字符串列表。最后我只打印了它们:

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? 
正如您在中所看到的,InputDStream是DStream的一个子类。这意味着您可以像访问数据流一样访问输入数据流

您只需在RDD上迭代即可“获取”消息字符串,如下所示:

directKafkaStream.foreachRDD { rdd => 
  rdd.foreach { content => 
    // code to handle the string here
  }
}
一般来说,它取决于您期望的类型(例如,自定义Avro记录),但在您处理字符串的情况下,将rdd视为字符串集合就足够了

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

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


然而,从您的问题来看,您似乎需要阅读一些关于Spark流的文档:是一个很好的资源(尽管有些书,如Learning Spark,可能也会帮助您理解)。

将rdd视为字符串给了我类似于“KafkaRDD[125]在MyKafkarbakeXample的createDirectStream。scala:45”
directKafkaStream.foreachRDD(rdd=>{println(rdd.toString())})