莎士比亚文集词频统计并行化算法

大家好,好久没没更新Spark类容了,主要是最近考试比较多。今天先给大家展示一个实战案例,这个案例是我在今年参加第一届高校云计算应

创新大赛时技能赛第四题——莎士比亚文集词频统计并行化算加法。PS:感谢师兄辉哥,真大神!

题目是这样的(这里截图展示出来):

a

在这里停词表的作用是对于在该表中的单词不予以统计,一般而言停词表中的单词是出现频率比较高的单词(如the)。这个案例比较简单,但

是要优化还是需要花费一点心思。

有的人的思路可能是这样的:先对莎士比亚文集进行wordcount操作统计出各个单词的出现频率,然后对wordcount中的结果过滤掉在停词表

现的单词,最后找到出现频率最高的100个即可。这种方式可行,但效率略低。大家知道wordcount包含shuffle操作,shuffle所带来的IO是spark

性能的瓶颈。我们在写程序的时候应该尽可能的较少shuffle IO,那么如何减少shuffle IO呢,在这里我们可以尽量减少要参与shuffle操作的数据。

所以,优化的思路是对莎士比亚文集进行单词分片后就进行过滤操作,过滤掉在停词表中得单词,然后进行wordcount操作。这样一来我们可以

过滤掉大量出现频率很高的词汇从而减少了主要shuffle IO。可能有的同学会问那这里的filter操作岂不是比上面的思路中filter操作需要处理的单词书更

多,确实是这样。但是对性能没有任何影响,为什么这么说?大家知道spark的一个优良的特点就是它的pipeline(血统),我们的处理在每一个shuffle

操作之 前都会算作一个同一个stage,在这个satge中的计算都是在最后的action时才进行的,血统就是具有这一优良特性。那么对每一个partiton上的

文本进行单词切割后进行filter操作是不是具有pipeline的特性?是不是这两个操作就像血液一样瞬间流过你的血管中的两个细胞?是不是几乎是同时发

生?是不是没有任何性能影响?

此外,我们还可以将规模较小的停词表放在一个hash表中,hash查找的效率几乎为单位时间(大家一定要多关注hash的原理,前几天百度面试包

含了很多hash类容)。

说了这么多,下面贴出源码:

  1. import org.apache.spark.SparkContext._
  2. import org.apache.spark.SparkConf
  3. import org.apache.spark._

  4. object Shakespear {
  5.   def main(args: Array[String]) {
  6.     if (args.length != 3) {
  7.       println("USage:<Shakespear> <Stopwords> <Out>")
  8.     }
  9.     //initial SparkConf and SparkContext
  10.     val sc = new SparkContext()

  11.     //To get Shakespear'paper
  12.     val papers = sc.textFile(args(0))
  13.     //To get stopwords
  14.     val stopWords = sc.textFile(args(1)).map(_.trim).collect().toSet + ""

  15.     //To parse papers into words and find the words statisfy the requirement
  16.     val words = papers.flatMap(_.split("[^a-zA-Z]")).map(_.toLowerCase).filter(!stopWords(_)).map((_,1)).
  17.                 reduceByKey(_ + _).map(line=>(line._2, line._1)).top(100).map(line=>(line._2, line._1))

  18.     val result = sc.parallelize(words)

  19.     //To write the result into hdfs
  20.     result.saveAsTextFile(args(2))
  21.   }
  22. }
在后面我会提供包含技能赛第三题以及其他的案例详解。希望大家共同学习讨论。
(by老杨,转载请注明出处)

posted on 2015-01-03 09:08  老杨的专栏  阅读(336)  评论(0编辑  收藏  举报

导航