王國珺,林 峰
(福州職業技術學院 福建 福州 350000)
采用任何方式抓取到的微博評論數據通常比較亂,其中有一些無用信息,而我們的目標是只提取其中的中文文字內容,因此抓取的數據在分析之前,必須進行清洗。數據清洗分為3個步驟,即抽取、轉換、加載。當數據量增大時,傳統的清洗技術已無法滿足企業之間的技術支持,所以本文結合MapReduce分而治之的思想設計出分布式數據清洗系統[1]。
微博數據首先是以半結構化XML格式存儲的,每個評論版塊內容用


再看中間的具體內容結構,存儲格式如下:

其中每對標簽中對應的屬性名個數并不一致,屬性值用雙引號(””)進行標識,屬性值內容中也出現雙引號內容時,用轉義符號" "替代。如下面兩行數據的舉例中,有的屬性值中有Score(評分)項,有的記錄中沒有。

微博數據統計分析中,對于某類評論內容較多,每天或每天中某時主題帖子評論的數量及長度,或哪些用戶較活躍等,這些都需要將數據從XML存儲的格式中提取出來,例如哪些內容是哪個主題的,每一條評論內容中指定屬性值的提取等。該微博數據的結構決定了數據清洗大體是分兩種情況。
情況1:針對XML標簽進行主題清洗。
將不同主題數據以不同目錄的形式生成,針對每個目錄下存儲相應主題的評論內容,即每對
情況2:針對<屬性名1=”屬性值1”>鍵值對數據的清洗。
獲取內容指定屬性值,例如獲取Text(評論內容)或CreationDate(評論時間)的值。由于標簽是成對出現,每個值用雙引號進行標簽,我們可以試著應用Map集合的方法進行提取。
為了實現該微博存儲結構數據清洗的目的,首先需要當前運行的Hadoop的分片API查詢,看是否存儲已有的功能接口可以實現我們的需求。本案例借助對系統要求較低的Eclipse免費工具進行編寫,具體實現過程主要分3個大任務[3]。
任務1:Eclipse下建立項目并準備實驗數據。
主要完成項目編程過程的前期準備工作,主要分兩步完成:第1步:Eclipse下項目建立。例如建立一個名這BlogsCleanMRProject的項目。
第2步:實驗數據準備。可將數據暫時放入當前項目的根目錄下。
任務2:編寫MapReduce程序實現XML數據清洗。
第1步:自定義分片的編寫。
主要完成自定義RecordReader類(命名為XMLRecord Reader.java)和自定義InputFormat類(命名為XMLInput Format.java)的創建。Src下出現了設置的包名,包名下多出新建立的類文件XMLRecordReader.java,并且該文件在Eclipse工具中央窗口位置打開,可以在此進行代碼的編輯,見圖1。

圖1 編程窗口
編寫XMLRecordReader類文件程序,部分參考代碼如下。


第2步:編寫Mapper類實現XML指定標簽內容讀取與數據分箱。
(1)選中項目下包名com.apache.hadoop.mr.split,鼠標右鍵,依次選擇New->class選項,在彈出的New Java Class窗口中配置包名和類文件名XMLMapper,單擊Finish按鈕。見圖2。

圖2 配置XMLMapper
(2)在新建立的XMLInputFormat類文件中編寫程序,參考代碼如下。


任務3:編寫MapReduce程序實現評論內容屬性值的解析。
任務2中實現了Mapper中map方法讀取的是一條一條的對應的值,即每一條評論的內容,這些內容是以<屬性名1=”屬性值1”,屬性名2=”屬性值2”,……,屬性名n=”屬性值n”>成對的方式出現的,每條數據量在本地Hadoop集群的節點中的Mapper進程中運行是綽綽有余的,故只需要編寫一個解析<屬性名1=”屬性值1”>對的方法即可。由于中值的屬性對個數并不統一,例如有的有Score評分項,有的沒有,所以可將解析出來的內容以鍵值對的方式存儲入集合中,供程序調用即可,故本任務實現過程主要分3步[4]。
第1步:編寫解析每條評論內容的類文件,例如MRUtils.java。即將中值中每對屬性的解析出來,以鍵值對的方式存儲入集合中。
第2步:編寫Mapper類讀取評論中指定屬性Text和CreationDate的值。在任務2的基礎上在Mapper類中調用,并通過MRUtils類解析中值中每對屬性值,做這map的K-V傳入上下文中。
第3步:編寫Job類運行MapReduce程序。在當前Eclipse工具的Hadoop環境下運行編寫好的MapReduce程序,并觀察運行過程,查看運行結果,驗證程序正確執行。
案例主要完成Eclipse工具下編寫MapReduce程序實現微博數據的清洗工作。整個程序編寫的過程中并不需要開啟Hadoop環境,好處是節省系統資源,使程序編寫調試過程更加流暢。實際應用時,可將寫好的程序打成Jar包,啟動Hadoop平臺后,在Hadoop平臺上運行。