我对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?
答案 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>