劉磊,蔡欣樺,許銳強
(廣東開放大學,廣州510000;廣東理工職業學院,廣州510000)
隨著云計算、大數據、人工智能等技術的飛速發展和應用,各行各業產生的數據規模也呈爆炸性增長,通過使用大數據平臺對海量的行業數據信息進行分析挖據,提取出有價值的信息,對市場決策起到輔助作用。各行業通過各種不同方式產生的大量數據,堆積起來達到一定規模,可以構成大數據,大數據分析就是利用特定平臺對規模巨大的數據進行分析挖掘,找到相關因素之間的關系。例如大數據分析可以讓超市使用通過收集到的大數據來研究消費者的習慣,根據分析結果更合理地擺放商品的位置以增加銷售量,從而為公司帶來更高的利潤。本文分析的是汽車銷售數據,汽車銷售是消費者支出的重要組成成分,也是了解一個國家經濟循環強弱情況的第一手資料,早于其他個人消費數據的公布,汽車銷售為隨后的零售額和個人消費支出提供了很好的預示作用,汽車消費額占零售額的25%和整個銷售總額的8%。本文使用華為大數據平臺,從三個角度對汽車銷售數據進行分析,并對分析結果進行可視化展示,非常直觀地展現數據價值。
華為大數據平臺FusionInsight HD 是華為企業級大數據存儲、查詢、分析的統一平臺,通過分布式部署,對外提供大容量的數據存儲、查詢和分析能力,能夠快速構建海量數據信息處理系統,對海量信息數據實時與非實時的分析挖掘,FusionInsight HD 兼容開源Hadoop 框架及眾多組件,是完全開放的大數據平臺,可運行在開放的x86 架構服務器上。FusionInsight HD 系統的邏輯架構如圖1 所示。

圖1 FusionInsight HD系統邏輯架構圖
FusionInsight HD 對開源組件進行封裝和增強,包含了管理系統Manager 和眾多組件,常用功能如下:
(1)Manager:運維管理系統,為FusionInsight HD提供高可靠、安全、容錯、易用的集群管理能力,支持大規模集群的安裝部署、監控、告警、用戶管理、權限管理、審計、服務管理、健康檢查、問題定位、升級和補丁等;
(2)Loader:實現FusionInsight HD 與關系型數據庫、文件系統之間交換數據和文件的加載工具;同時提供REST API 接口,供第三方調度平臺調用。Loader支持關系型數據庫和HDFS、HBase、Hive 表等之間的互相導入導出。本文采用Loader 對加載和導出數據。
(3)Hive:建立在Hadoop 基礎上的開源的數據倉庫,提供類似SQL 的Hive Query Language 語言(HQL)操作結構化數據存儲服務和基本的數據分析服務。本文采用HQL 對數據進行分析。
(4)MapReduce:提供快速并行處理大量數據的能力,是一種分布式數據處理模式和執行環境。本文采用Python 編寫MapReduce 程序對數據進行清洗。
(5)HDFS:Hadoop 分布式文件系統(Hadoop Distributed File System),提供高吞吐量的數據訪問,適合大規模數據集方面的應用。
(6)HBase:提供海量數據存儲功能,是一種構建在HDFS 之上的分布式、面向列的存儲系統。
基于大數據平臺對海量數據分析展示一般分步進行,本文對汽車銷售數據分析設計的方案如下:
(1)獲取源數據:本文汽車銷售數據來源于互聯網,可以通過大數據交易、API 接口、網絡爬蟲、統計圖表等方式獲取源數據。
(2)分析源數據:源數據拿到后,根據定下的分析角度,分析源數據字段是否全部滿足分析角度的需求,是否有臟數據,是否需要數據清洗,本文從三個角度分析:行業市場分析、用戶市場分析、不同品牌市場分析。
(3)加載源數據:使用ETL 工具將源數據導入HDFS,這里采用Loader 組件將數據從關系型數據庫導入Hive 表。
(4)數據預處理:源數據通常包含臟數據,不能直接用來分析,需要根據需求進行預處理,包括數據清洗,缺省值填充,數據選擇,數據變換,數據集成等。
(5)HQL 分析:對預處理后的數據,使用HQL 語言進行分析,HQL 可以查詢和分析存儲在Hadoop 中的大規模數據,使用HQL 可以快速方便地進行MapReduce 統計。
(6)Python 分析:使用Python 編寫MapReduce 程序進行數據清洗和可視化呈現分析結果。
(7)導出分析結果:使用Loader 工具將分析結果從HDFS 導出到關系型數據庫,為Web 系統應用提供大數據分析結果。

圖2 分析方案示意圖
本文收集到的汽車銷售數據,包含銷售信息和具體參數信息,數據包括汽車生產地點、生產時間、車輛型號、品牌、車輛類型、排量、油耗、功率、發動機型號、燃料種類、車外廓長寬高、軸距、前后車輪、輪胎規格、輪胎數、載客數、購買人相關信息等,共70 萬條記錄,樣例數據如圖3。

圖3 源數據樣例
這些源數據存儲在關系型數據庫MySQL 中,定義表名為te_bd_sp,通過分析源數據,使用Loader 工具加載轉換時,做出處理:①第一行為字段,數據無效,去除第一行;②具體參數對于后面的分析角度無用,去除一些具體參數字段。處理后的源數據格式,如表1 所示。
高質量的大數據分析要基于高質量的數據,但是源數據通常存在部分臟數據,例如數據不完整、數據存在錯誤或異常、數據內容不一致等。這時要根據分析需求預先進行數據清洗。數據清洗是清除錯誤和不一致數據的過程,在數據挖掘過程中,數據清洗是第一步驟,即對數據進行預處理的過程,數據是不完整、有噪聲和不一致的,數據清洗的任務是過濾或者修改那些不符合要求的數據,數據清洗的目的是為分析提供準確而有效地數據,提高分析效率。

表1 處理后的源數據格式
通過分析汽車銷售數據,發現存在內容缺失的數據行,部分省份信息缺失的數據行內容殘缺,影響后面的數據分析,因此對省份缺失的數據也進行過濾。編寫MapReduce 程序進行數據清洗,清洗過程由Mapper負責,Reducer 則負責把清洗后的數據輸出,使用Python 編寫代碼。
Mapper 部分代碼如下:


使用以下語句執行MapReduce 程序:
yarn jar godlike/Yarn/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar-file data_analysis_map_version_3.py,data_analysis_reduce_version_3.py -mapper data_analysis_map_version_3.py-reducer data_analysis_reduce_version_3.py-input/tenant/user04/data/*-output/tenant/user04/opt
Hive 是基于Hadoop 的數據倉庫基礎構架,可以將結構化的數據文件映射為一張數據庫表,提供了一種存儲、查詢和分析Hadoop 中的大規模數據的機制。Hive 定義了簡單的類SQL 查詢語言,稱為HQL,它允許熟悉SQL 的用戶查詢數據,可以將HQL 語句轉換為MapReduce 任務進行運行。其優點是學習成本低,可以通過類SQL 語句快速實現簡單的MapReduce 統計,不必開發專門的MapReduce 應用,十分適合數據倉庫的統計分析。同時,這個語言也允許熟悉MapReduce的開發者開發自定義的mapper 和reducer 來處理內建的程序無法完成的復雜分析工作。
Hive 中所有的數據都存儲在HDFS 中,支持textfile、Sequencefile、Rcfile 等數據格式。使用Hive 創建表的時候,需要設定數據中的列分隔符和行分隔符,這樣才能將數據正確導入Hive 表。
車輛銷售數據創建Hive 表語句如下:
create table table_name(sp_id int,province string,month int,dc string,qx string,year int,car_type string,manufacturer string,pinpai string,leixing string,suoyouquan string,xingzhi string,nums int,fdj_type string,pailiang string gonglv int,ry_type string,fdjqy string,car_name string,1age int,sex string)row format delimited fields terminated by‘,’lines terminated by‘ ’;
使用load 將清洗完的數據導入Hive 表,語句為:
load data inpath‘/tenant/user04/opt5/part-00000’into table te_bd_sp;
下面使用HQL 從三個角度分析車輛銷售數據:
(1)汽車行業市場分析
例如統計山西省2013 年每個月的汽車銷售數量的比例,需要的字段為省、年、月、銷量,先統計出總銷量,再統計出2013 年每個月的銷量,兩表進行join 操作,計算出比例,分析語句如下:
select t2.m as`月`,CONCAT(ROUND(t2.n/t1.r1*100,2),'','%')as`比例`from(select sum(nums)r1 from te_bd_sp where province='山西省'and year='2013')t1 join(select month m,sum(nums)n from te_bd_sp where province='山西省'and year='2013'group by month)t2 on 1=1;
運行結果如圖4 所示。
(2)用戶市場分析:
例如統計買車的人的性別比例,需要的字段為性別、主鍵,先統計出所有的銷售數量,再按性別分組統計出銷售數量,兩表進行join 操作,計算出比例,分析語句如下:
select(case when t2.m='男性 'then'男性'when t2.m='女性 'then'女性'else'無性別'end)as`性別`,CONCAT(ROUND(t2.n/t1.r1*100,2),'','%')as`比例`from(select count(sp_id)r1 from te_bd_sp) t1 join (select sex m,count(sp_id) n from te_bd_sp group by sex)t2 on 1=1;

圖4 汽車行業市場分析

圖5 用戶市場分析
(3)不同品牌市場分析:
例如統計五菱在2013 年每個月的銷售量和增長率,需要的字段為品牌、年、月、銷量,增長率計算公式為:(本月銷量-上月銷量)/上月銷量*100%,先統計出每個月的銷量,再使用Hive 窗口函數LAG(col,n,DEFAULT)獲取上月銷量,計算出增長率,分析語句如下:
select month as`月`,sum(nums)as`銷售量`,CONCAT(ROUND((sum(nums)-lag(sum(nums),1,0)over(order by month))/(lag(sum(nums),1,0)over(order by month))*100,2),'','%')as`增長率`from te_bd_sp where pinpai='五菱'and year='2013'group by month;
運行結果如圖6 所示。
將大數據分析結果導入關系型數據庫,使用Python 代碼編寫程序,從數據庫讀取數據,呈現可視化結果。

圖6 不同品牌市場分析
以統計山西省2013 年每個月的汽車銷售數量的比例結果為例,使用Python 編寫關鍵代碼如下:

(1)分析每個月的汽車銷售比例,按每月比例組成的餅圖如圖7 所示。

圖7 餅圖
(2)分析買車人的性別比例,有部分沒填性別,顯示時設置為無性別,所形成柱狀圖如圖8 所示:

圖8 柱狀圖
(3)分析五菱在2013 年每月增長趨勢,形成折線圖如圖9 所示。

圖9 折線圖
傳統行業產生的海量數據正呈指數性增長,如何從這么大規模的數據量中分析挖掘出有價值的信息,這給技術帶來了挑戰。隨著大數據平臺的日漸成熟和普及,能夠輕松實現TB 級數據的存儲、PB 級數據的查詢分析,為海量數據的分析預測提供了技術手段。本文基于業界流行的華為大數據平臺,對車輛銷售數據進行了三個角度的分析,先進行數據清洗,再使用HQL語言做統計分析,最后使用Python 可視化分析結果,為基于大數據平臺的分析應用提供了參考。