史媛
(山西機電職業(yè)技術學院 山西省長治市 046011)
近年來,大數據技術已經深入到生活的方方面面,大數據處理技術更是以前所未有的速度在向前發(fā)展。在大數據處理技術中,Spark 技術取得的成就引人注目。Spark 是快速通用的大規(guī)模數據處理引擎,它是基于內存的、分布式的大數據處理框架,和Hadoop中的MapReduce 類似,都是對數據進行處理,處于同一個層面,但是Hadoop 允許部署在一些低端的硬件上,這就造成了Hadoop在運算過程中的速度受限于最低速的硬件,而Spark 是面向內存的大數據處理引擎,基于內存的運算速度遠遠大于基于磁盤的運算速度,相當于“高富帥”,因而Spark 越來越被重量級的數據企業(yè)所青睞。
在Spark 中,主 要 有SparkSQL、SparkStreaming、GraphX、MLlib 四個組件,其中,SparkSQL 是Spark 用來操作結構化數據的組件,通過SparkSQL,用戶可以使用SQL 或者Apache Hive的HQL 語言來查詢數據,它支持多種數據源類型,如Hive 表、Parquet 以及JSON 等。SparkSQL 為Spark 提供了SQL 借口,還允許開發(fā)者將SQL 語句融入到Spark 應用程序中。本文就SparkSQL在圖書信息上的應用做簡單介紹。
圖書館中的圖書藏量十分龐大,要從中分析圖書的相關信息,比如:統(tǒng)計各種分類中圖書數量、統(tǒng)計圖書借閱量、統(tǒng)計讀者借閱情況等。圖書館的管理人員就能夠根據這些分析出來的信息得出相應的結果,從而做出對應的決策,例如:下架借閱量低的圖書、增加受歡迎圖書類型的購書量、舉辦圖書推薦活動吸引讀者等,以此來增加圖書館的人流量和借閱量。圖書館中圖書數據、借閱數據十分龐大,采用以往的手段來統(tǒng)計,費時費力,可以將數據用Spark技術處理,運用SparkSQL 組件計算相關信息。
圖書信息中有圖書表——存儲圖書相關數據、讀者表——存儲讀者相關數據、借閱表——存儲借閱相關數據,原始數據文件都不是SparkSQL 能處理的格式,需要轉換為SparkSQL 能處理的格式——DataFrame 數據集。
DataFrame 是以RDD 為基礎的分布式數據集,和傳統(tǒng)數據庫的二維表格類似,它是以列方式存儲數據的,每一列都帶有名稱和類型,這和以往以行方式存儲數據的數據表不同,它對數據的內部結構有非常強的描述能力。SparkSQL 處理的對象就是DataFrame。
選擇通過反射機制創(chuàng)建DataFrame。
圖1:DataFrame 創(chuàng)建
圖2:各類圖書借閱量排序結果
圖3:各類職業(yè)讀者數量
圖4:各類圖書價格總和
首先,在集群上將文件上傳到HDFS 上,以圖書文件為例。
hdfs dfs -put Book.txt/Book_Spark/data
第二步,進入Spark 環(huán)境,定義對應的樣本類。
case class Book(Id:String,Name:String,Price:Int,Publisher:String,A uthor:String,Classification:String)
第三步,加載文件,轉換為RDD
scala>val rdd=sc.textFile(“/Book_Spark/data/Book.txt”).map(_.split(“,”)).map(p=> Book(p(0),p(1),p(2).trim.toInt,p(3),p(4),p(5)))
第四步,使用toDF()方法轉換為DataFrame
scala>val book=rdd.toDF()
第五步,將DataFrame 注冊為臨時表
scala>book.registerTempTable(“temp_book”)
scala>book.show
運行結果如圖1。
從圖1可以看到圖書文件中的信息,這表明已經將圖書文件成功轉換為DataFrame。讀者文件和借閱文件轉換DataFrame 采用上述同樣的方法進行轉換,轉換后的DataFrame 名稱分別為reader 和borrow。
上面步驟完成后就可以使用SparkSQL 進行數據處理了。為了分析讀者喜好哪一類圖書,可以看看哪一類圖書的借閱量最大。
3.2.1 統(tǒng)計各類圖書借閱量,降序排序
scala>sqlContext.sql(“selecth.Classification,count(h.Id) as count from temp_book h join temp_borrow k on h.Id=k.Bid group by h.Classification order by count”).show
根據圖2統(tǒng)計結果,圖書館在購置圖書的時候可以偏向借閱量比較大的圖書類型。對那些節(jié)約量比較低的圖書,可以適當調整書架位置或者是下架。
3.2.2 查看借書讀者信息
scala>sqlContext.sql(“select r.* from temp_reader r join temp_borrow b on r.Id=b.Rid”).show
從查看借書讀者的結果可以分析,經常借閱圖書的讀者年齡、職業(yè)等。
3.2.3 統(tǒng)計男女讀者數量
scala>sqlContext.sql(“select sex,count(Id) from temp_reader group by sex”).show
3.2.4 統(tǒng)計借閱圖書讀者年齡段數量
scala>sqlContext.sql(“select count(r.Id) as Less_then_10 from temp_reader r join temp_borrow b on r.Id=b.Rid where r.Age <10”).show
年齡可以更換,各個年齡段的數量都可以統(tǒng)計。
3.2.5 統(tǒng)計各類職業(yè)讀者數量
scala>sqlContext.sql(“select Occupation,count(Id) as Number from temp_reader group by Occupation”).show
從注冊登記讀者性別數量中可以分析出,經常或者有意愿來圖書館看書、借書的人是男讀者多還是女讀者多;從年齡統(tǒng)計上可以看出借書的是哪個年齡段的人比較多;從注冊登記讀者職業(yè)數量上來看,哪類職業(yè)的讀者更有意愿來圖書館看書或借書,綜合借書讀者信息的統(tǒng)計結果進行分析,這樣,圖書館在舉辦相關活動的時候主題可以有所偏向,比如,可以舉辦相應的圖書展覽會,作者讀者見面會、主題活動等吸引更多沒有注冊登記讀者來參加活動,更加符合讀者年齡、類型和讀者看書意愿,在推薦圖書的時候目標性更強,活動舉辦的效果更好。
另外,圖書館還可以統(tǒng)計圖書的一些信息。
3.2.6 對圖書價格進行降序排序,看看圖書最高的價格和最低的價格
scala>book.orderby(book(“price”)).show(5)
或者
scala>book.sort($“price”.desc).show(5)
3.2.7 統(tǒng)計各類圖書數量
scala>sqlContext.sql(“select count(Id),Classification from temp_book groupby Classification ”).show
3.2.8 求各類圖書價格總和信息
scala>sqlContext.sql(“select Classification,sum(price) from temp_book group by Classification”).show
根據圖4結果可以幫助圖書館對圖書進行調整和編制購置預案等。
可以看出,SparkSQL 在處理結構化數據上有著良好的處理能力,Spark 技術的Scala 語言比較精煉,能夠很高效、準確地進行數據處理,SparkSQL 不僅僅可以使用Scala 語言實現,還可以融入到Python、Java 語言中,而且SparkSQL 還可以結合Hive 等大數據工具進行更復雜的數據處理和分析,即在大數據生態(tài)圈里進行數據的采集、處理和分析。本文中的案例只是單獨運用了SparkSQL組件進行數據處理,原始數據來源于文本文件,沒有存儲到數據庫中,這有缺陷,比如,年齡的更改和計算,文本文件去更改就比較麻煩,但是如果放入到數據庫中就可以使用SQL 語句很方便地更改或計算年齡。學生要掌握SparkSQL,前提是對數據庫和SQL 語言要十分熟悉,并且能夠靈活運用。在以后的教學中,可多多增加Python 和Java 語言融合Scala 的案例和結合Hive 等大數據工具分析處理數據的案例,接近工程實際,靈活運用SparkSQL。