Spark入門--倒排索引
阿新 • • 發佈:2018-12-22
思路
這個程式我可是花了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)