2016-11-17 38 views
1

我将单词列表作为DStream。例如:列表(汽车,速度,事故,速度,坏)。我想从这个列表中形成双克。我有RDD,但面临DStreams的问题。我正在使用foreachRDD函数。下面是我的 -DStream中的列表处理

我试图在转换后打印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后的内容。即使我在打印定义中使用println(z),它也会在flatMap中返回MapPartitionsRDD [18]。我正在使用Kafka火花流式传输来读取输入,我在控制台上获取单词值。我认为在调用printRDD函数后单词不会改变。

+0

流处理后bigrams会发生什么?该功能仅用于控制台打印。 – maasg

回答

1

你可以做所有这些在DStream操作,内部没有foreachRDD,然后调用printDStream

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和揭露RDD内的实际类型,所以你不应该需要使用foreachRDD可以达到内部的实际数据。