您的位置:首页 > 其它

Spark入门--倒排索引

2015-07-31 16:32 393 查看

思路

这个程序我可是花了3天才写起来的,主要是学习嘛,很多API不知道,一边查一边学喽。

首先读取文件夹里面的所有文件,将每个文件的内容按行拆分,然后再按单词拆分,组成(文件名,单词)对,然后再合并,最后得到我们的结果

输入

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: