Spark--倒排索引

Spark--倒排索引

输入

id1

hello world
hello hadoop
hadoop love
love cat
cat love rabbit

id2

hello spark
the spark app for you
I love you
you are a cat

id3

hello cat
hello rabbit
cat is doing spark
cat is the world
spark is good

id4

spark is better than hadoop
I love hadoop
you love spark
cat and rabbit love app

id5

hadoop is good in world
spark is very famous in world
I am rabbit
you are cat

代码

import org.apache.spark.{SparkContext, SparkConf}
import scala.collection.mutable._
/**
 * Created by xuyao on 15-7-29.
 */
object Inverted_index {
   def main (args: Array[String]) {
    val conf = new SparkConf().setAppName("Inverted Index")
     val sc =new SparkContext(conf)
     //SparkContext.wholeTextFiles允许你读取文件夹下所有的文件,比如多个小的文本文件, 返回文件名/内容对。
     val files =sc.wholeTextFiles("Inverted_index_dir")
     //因为读进来的文件是路径,所以要把文件名过滤一下,前面的都去掉,只留下文件自己的名字
     val file_name_length = files.map(x=>x._1.split("/").length).collect()(0)
     val file_name_context= files.map(x=>(x._1.split("/")(file_name_length-1),x._2)).sortByKey()
     //words为我们最后得到的(文件名,单词)对
     //scala语言非常神奇的是可以在算子里面写类似java的代码段。flatMap可以将分区合成一个分区
     val words =file_name_context.flatMap(x=>{
       //首先要根据行来切分
       val line =x._2.split("\n")
       //每个文件生成的(文件名,单词)对用链表给串起来。注意按照下面的方法生成的list是带有一个空节点的指针,也就是说它的第一元素是null
       val list =LinkedList[(String,String)]()
       //这里和C++有点像,temnp相当于是一个临时的指针,用来给list插入元素的。在scala语言中,val是不可变的,var是可变的
       var temp =list
       //对每一行而言,需要根据单词拆分,然后把每个单词组成(文件名,单词)对,链到list上
       for(i <- 0 to line.length-1){
         val word =line(i).split(" ").iterator
         while (word.hasNext){
           temp.next=LinkedList[(String,String)]((x._1,word.next()))
           temp=temp.next
         }
       }
       //我们得到的list的第一个元素是null,drop函数是去掉前n个数,这里是1,我们要把第一个元素null给去掉
       val list_end=list.drop(1)
       //这个list_end是这个flatMap算子中x所要得到的东西,scala语言居然可以这样写,我也是醉了
       list_end
     }).distinct()//需要去重
     //首先按照文件名排序,然后调换map的位置,将文件名串起来,再根据单词排序,最后保存
     words.sortByKey().map(x=>(x._2,x._1)).reduceByKey((a,b)=>a+";"+b).sortByKey().saveAsTextFile("index")
     sc.stop()
  }

}

结果

(I,id2;id4;id5)
(a,id2)
(am,id5)
(and,id4)
(app,id2;id4)
(are,id2;id5)
(better,id4)
(cat,id1;id2;id3;id4;id5)
(doing,id3)
(famous,id5)
(for,id2)
(good,id3;id5)
(hadoop,id1;id4;id5)
(hello,id1;id2;id3)
(in,id5)
(is,id3;id4;id5)
(love,id1;id2;id4)
(rabbit,id1;id3;id4;id5)
(spark,id2;id3;id4;id5)
(than,id4)
(the,id2;id3)
(very,id5)
(world,id1;id3;id5)
(you,id2;id4;id5)
  •  

猜你喜欢

转载自blog.csdn.net/weixin_44481878/article/details/88079932