DStream中的列表处理

时间:2016-11-17 20:12:14

标签: scala apache-spark spark-streaming

我将单词列表作为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函数后,这些单词不会改变。

1 个答案:

答案 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来获取内部的实际数据。