我将单词列表作为DStream。例如:列表(汽车,速度,事故,速度,坏)。我想从这个列表中形成bi克。我有这个与RDD,但面临DStreams的问题。我正在使用foreachRDD函数。以下是我的内容 -
尝试在转换后打印RDD的内容。
def printRDD(rddString: RDD[String]) ={
val z = rddString.map( y => y.toString.split(",").filter(_.nonEmpty).
map( y => y.replaceAll("""\W""", "").toLowerCase)
.filter(_.nonEmpty)
.sliding(2).filter(_.size == 2).map{ case Array(a, b) => ((a, b), 1) })
.flatMap(x => x)
println(z)
}
val x = lines.map(plainTextToLemmas(_, stopWords))
val words = x.flatMap( y=> y.toString.split(","))
words.foreachRDD( rdd => printRDD(rdd))
有没有办法在转换函数printRDD后显示内容。即使我在print定义中使用println(z),它也会在flatMap中返回MapPartitionsRDD [18]。我正在使用Kafka spark streaming来读取输入,我在控制台上获得了单词值。我认为在调用printRDD函数后,这些单词不会改变。
答案 0 :(得分:1)
您可以在DStream
而非foreachRDD
内执行所有这些操作,然后在print
上致电DStream
:
lines
.map(plainTextToLemmas(_, stopWords))
.flatMap(y => y.toString.split(","))
.map(y => y.toString.split(",").filter(_.nonEmpty))
.map(y => y.replaceAll("""\W""", "").toLowerCase)
.filter(_.nonEmpty)
.sliding(2)
.filter(_.size == 2)
.flatMap { case Array(a, b) => ((a, b), 1) }
.print()
这应该将DStream
的内容打印到驱动程序上的控制台。
需要注意的一件重要事情是,尽管您在DStream
上运行,但它的方法是在给定的批处理时间“钻入”基础RDD
并在{{{{}}内部显示实际类型1}},因此您不需要使用RDD
来获取内部的实际数据。