1. 程式人生 > >Spark入門--倒排索引

Spark入門--倒排索引

思路

這個程式我可是花了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)