Spark入门--倒排索引
2015-07-31 16:32
393 查看
思路
这个程序我可是花了3天才写起来的,主要是学习嘛,很多API不知道,一边查一边学喽。首先读取文件夹里面的所有文件,将每个文件的内容按行拆分,然后再按单词拆分,组成(文件名,单词)对,然后再合并,最后得到我们的结果
输入
id1hello 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)
相关文章推荐
- 如何为公司导入项目管理制度
- 插入数据时密码使用MD5加密算法加密
- Anddroid之Menu用法
- jQuery 插件集锦——《导航篇》
- PCIe SSD Wear-Leveling磨损均衡
- 20150725 前端开发工具DreamWeaver及Sublime方法技巧总结
- Rice-IIIP (1)
- jmp指令对应的机器码
- MFC&ATL&STL比较
- HDOJ1025(最长上升子序列)
- 暑假集训第三周第二阶段 搜索 D - 变形课
- 碉堡了!麻省理工学院开发出自动修复 Bug 的系统
- 如何使用php实现评委评分器
- 分享一个最近很火的响应式后台模板
- 【第二弹】【POJ1276】【Cash Machine】
- Java多线程总结
- UITableView - 2
- WPF BitMapImage 占用删除问题,更换头像问题
- Centos添加新硬盘、分区、格式化、自动挂载
- android rectF