劉磊,黃嘉浩,許銳強(qiáng),蔡欣樺
(廣東開放大學(xué),廣東理工職業(yè)學(xué)院,廣州 510000)
電商網(wǎng)站是當(dāng)今人們使用最多的Web應(yīng)用,大量用戶每日訪問網(wǎng)頁瀏覽商品、搜索喜歡的商品、查看商品詳情、收藏添加購(gòu)物車、登錄購(gòu)買商品等操作,在電商網(wǎng)站留下了海量的使用數(shù)據(jù),堆積起來達(dá)到一定規(guī)模,就構(gòu)成大數(shù)據(jù),大數(shù)據(jù)分析就是利用特定平臺(tái)對(duì)規(guī)模巨大的數(shù)據(jù)進(jìn)行分析挖掘,找到相關(guān)因素之間的關(guān)系。本文以某電商網(wǎng)站的Web日志、用戶維表、商品維表、銷售事實(shí)表為源數(shù)據(jù),通過源數(shù)據(jù)分析、數(shù)據(jù)清洗、HQL分析、數(shù)據(jù)可視化等步驟,從用戶瀏覽量、銷售量、點(diǎn)擊量、商品好評(píng)等角度,分析每個(gè)用戶對(duì)不同類型商品的喜好程度,從而為電商網(wǎng)站在相應(yīng)頁面推薦合適商品給不同用戶,優(yōu)化網(wǎng)站建設(shè),提升用戶體驗(yàn)并促進(jìn)用戶消費(fèi)。
華為大數(shù)據(jù)平臺(tái)FusionInsight HD是華為企業(yè)級(jí)大數(shù)據(jù)存儲(chǔ)、查詢、分析的統(tǒng)一平臺(tái),通過分布式部署,對(duì)外提供大容量的數(shù)據(jù)存儲(chǔ)、查詢和分析能力,能夠快速構(gòu)建海量數(shù)據(jù)信息處理系統(tǒng),對(duì)海量信息數(shù)據(jù)實(shí)時(shí)與非實(shí)時(shí)的分析挖掘,F(xiàn)usionInsight HD兼容開源Ha?doop框架及眾多組件,是完全開放的大數(shù)據(jù)平臺(tái),可運(yùn)行在開放的x86架構(gòu)服務(wù)器上[1]。FusionInsight HD對(duì)開源組件進(jìn)行封裝和增強(qiáng),包含了管理系統(tǒng)Manager和眾多組件,常用功能包括:①M(fèi)anager,運(yùn)維管理系統(tǒng);②Loader,實(shí)現(xiàn)FusionInsight HD與關(guān)系型數(shù)據(jù)庫、文件系統(tǒng)之間交換數(shù)據(jù)和文件的加載工具,Loader支持關(guān)系型數(shù)據(jù)庫和HDFS、HBase、Hive表等之間的互相導(dǎo)入導(dǎo)出;③Hive:建立在Hadoop基礎(chǔ)上的開源的數(shù)據(jù)倉庫,提供類似SQL的Hive Query Language語言(HQL)操作結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)服務(wù)和基本的數(shù)據(jù)分析服務(wù)。④MapReduce:提供快速并行處理大量數(shù)據(jù)的能力,是一種分布式數(shù)據(jù)處理模式和執(zhí)行環(huán)境[2]。本文采用Java編寫MapReduce程序?qū)?shù)據(jù)進(jìn)行清洗。
基于大數(shù)據(jù)平臺(tái)對(duì)海量數(shù)據(jù)分析展示一般分步進(jìn)行,本文對(duì)電商網(wǎng)站數(shù)據(jù)分析設(shè)計(jì)的方案如圖1所示。步驟如下:
(1)獲取源數(shù)據(jù):本文電商網(wǎng)站數(shù)據(jù)來源于互聯(lián)網(wǎng),可以通過大數(shù)據(jù)交易、API接口、網(wǎng)絡(luò)爬蟲、統(tǒng)計(jì)圖表等方式獲取源數(shù)據(jù)。
(2)分析源數(shù)據(jù):源數(shù)據(jù)拿到后,根據(jù)定下的分析角度,分析源數(shù)據(jù)字段是否全部滿足分析角度的需求,是否有臟數(shù)據(jù),是否需要數(shù)據(jù)清洗,本文從三個(gè)角度分析:分析每個(gè)商品的好評(píng)度、分析用戶粘度、分析用戶最喜歡購(gòu)買的商品。
(3)加載源數(shù)據(jù):使用ETL工具將源數(shù)據(jù)導(dǎo)入HDFS,這里采用Loader組件將數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫導(dǎo)入Hive表。
(4)數(shù)據(jù)預(yù)處理:源數(shù)據(jù)通常包含臟數(shù)據(jù),不能直接用來分析,需要根據(jù)需求進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗,缺省值填充,數(shù)據(jù)選擇,數(shù)據(jù)變換,數(shù)據(jù)集成等。
(5)HQL分析:對(duì)預(yù)處理后的數(shù)據(jù),使用HQL語言進(jìn)行分析,HQL可以查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù),使用HQL可以快速方便的進(jìn)行MapReduce統(tǒng)計(jì)。
(6)Java分析:使用Java編寫MapReduce程序進(jìn)行數(shù)據(jù)清洗和可視化呈現(xiàn)分析結(jié)果。
(7)導(dǎo)出分析結(jié)果:使用Loader工具將分析結(jié)果從HDFS導(dǎo)出到關(guān)系型數(shù)據(jù)庫,為Web系統(tǒng)應(yīng)用提供大數(shù)據(jù)分析結(jié)果。
圖1 分析方案示意圖
本文收集到的電商網(wǎng)站數(shù)據(jù),包含Web日志數(shù)據(jù)、用戶維表、商品維表和銷售事實(shí)表,Web日志數(shù)據(jù)存儲(chǔ)在HDFS文件系統(tǒng),數(shù)據(jù)量為1949878條,記錄用戶瀏覽網(wǎng)站的痕跡,源數(shù)據(jù)包含了一些錯(cuò)誤字段和臟數(shù)據(jù),需要先進(jìn)行數(shù)據(jù)清洗,再導(dǎo)入Hive進(jìn)行分析。用戶維表、商品維表和銷售事實(shí)表都存儲(chǔ)在MySQL關(guān)系型數(shù)據(jù)庫中,用戶維表記錄用戶的基本信息,數(shù)據(jù)量為100000條,定義表名為user;商品維表記錄商品的標(biāo)簽和價(jià)格,數(shù)據(jù)量為54條,定義表名為shop;銷售事實(shí)表存儲(chǔ)銷售記錄,數(shù)據(jù)量為1000001條,定義表名為sale。這三表存在主外鍵關(guān)系,銷售事實(shí)表里有兩個(gè)外鍵,用戶名字段來自用戶維表,商品ID字段來自商品維表。這三張表不需要數(shù)據(jù)清洗,直接使用Loader工具導(dǎo)入Hive數(shù)據(jù)倉庫。
高質(zhì)量的大數(shù)據(jù)分析要基于高質(zhì)量的數(shù)據(jù),但是源數(shù)據(jù)通常存在部分臟數(shù)據(jù),例如數(shù)據(jù)不完整、數(shù)據(jù)存在錯(cuò)誤或異常、數(shù)據(jù)內(nèi)容不一致等。這時(shí)要根據(jù)分析需求預(yù)先進(jìn)行數(shù)據(jù)清洗。
電商網(wǎng)站W(wǎng)eb日志源數(shù)據(jù)以文件形式存儲(chǔ)在HDFS文件系統(tǒng)中,使用命令查看,通過分析電商網(wǎng)站W(wǎng)eb日志源數(shù)據(jù),數(shù)據(jù)格式是每行為一條記錄,行之間通過換行符分開,每行數(shù)據(jù)用空格符分隔成9個(gè)不同字段數(shù)據(jù),除這些正確數(shù)據(jù)格式外,發(fā)現(xiàn)源數(shù)據(jù)還存在字段錯(cuò)誤、冗余數(shù)據(jù),影響后面的數(shù)據(jù)分析,因此對(duì)臟數(shù)據(jù)進(jìn)行過濾。編寫MapReduce程序進(jìn)行數(shù)據(jù)清洗,清洗過程由Mapper負(fù)責(zé),Reducer則負(fù)責(zé)把清洗后的數(shù)據(jù)輸出,使用Java編寫代碼。Mapper代碼獲取輸入流,按規(guī)則進(jìn)行清洗,首先對(duì)每一行按空格拆分成數(shù)組,判斷若數(shù)組長(zhǎng)度為9則符合要求,繼續(xù)清洗,使用Parselogs類將每行數(shù)據(jù)解析成9個(gè)字段,分別對(duì)應(yīng)用戶IP地址、用戶名、時(shí)間、商品一級(jí)標(biāo)簽、商品二級(jí)標(biāo)簽、商品ID、用戶訪問來源url地址、響應(yīng)碼、用戶訪問頁面所用的工具,將正確的數(shù)據(jù)交給Reducer[3-5]。
清洗完之后Web日志數(shù)據(jù)相對(duì)干凈和有規(guī)律,保留的結(jié)構(gòu)如表1所示。
表1 清洗后的Web日志數(shù)據(jù)(Web)結(jié)構(gòu)
Hive是基于Hadoop的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,提供了一種存儲(chǔ)、查詢和分析Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。Hive定義了簡(jiǎn)單的類SQL查詢語言,稱為HQL,它允許熟悉SQL的用戶查詢數(shù)據(jù),可以將HQL語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行[6]。
Hive中所有的數(shù)據(jù)都存儲(chǔ)在HDFS中,支持text?file、Sequencefile、Rcfile等數(shù)據(jù)格式。使用Hive創(chuàng)建表的時(shí)候,需要設(shè)定數(shù)據(jù)中的列分隔符和行分隔符,這樣才能將數(shù)據(jù)正確導(dǎo)入Hive表。
下面使用HQL從三個(gè)角度分析電商網(wǎng)站數(shù)據(jù):
(1)分析每個(gè)商品的好評(píng)度
計(jì)算每個(gè)商品的好評(píng)度,對(duì)商品做出合理評(píng)價(jià),給予用戶更好質(zhì)量的推薦,提高用戶體驗(yàn)度。設(shè)定好評(píng)度計(jì)算規(guī)則為:好評(píng)度=(5分次數(shù)+4分次數(shù)*0.8+3分次數(shù)*0.5)/評(píng)價(jià)總次數(shù),如果評(píng)價(jià)字段空缺,則用5分填充。本條分析數(shù)據(jù)來自銷售事實(shí)表(sale),根據(jù)商品ID分組統(tǒng)計(jì),計(jì)算每個(gè)商品的好評(píng)度,分析語句如下:
select goods_id as`商品 ID`,round(count(case when evalu?ates=4 then'4'end)+count(case when evaluates=3 then'3'end)+count(case when evaluates=5 and evaluates=''then'5'end)/count(evaluates),2)as`好評(píng)度`from sale group by goods_id order by`好評(píng)度`;
運(yùn)行結(jié)果如圖2所示。
圖2 統(tǒng)計(jì)商品的好評(píng)度
對(duì)數(shù)據(jù)結(jié)果進(jìn)行可視化展示,使用Java編寫代碼展示好評(píng)度排名前10的商品,效果如圖3所示。
(2)分析用戶粘度
從網(wǎng)頁URL被訪問的訪客數(shù)量和訪問總次數(shù)兩個(gè)角度分析網(wǎng)站的訪問粘性,分析訪問量最大的頁面,優(yōu)化其他頁面,衡量頁面更新前后受歡迎程度,從而優(yōu)化整體網(wǎng)站建設(shè)。本條分析數(shù)據(jù)來自用戶瀏覽網(wǎng)站的Web日志記錄(web),根據(jù)網(wǎng)頁URL分組統(tǒng)計(jì),計(jì)算不重復(fù)的訪客數(shù)量,頁面訪問總次數(shù),并按降序排列,分析語句如下:
select url as`網(wǎng)頁 URL`,count(distinct user_id)as`訪客數(shù)量`,count(url)as`訪問總次數(shù)`from web group by url;
運(yùn)行結(jié)果如圖4所示。
圖3 統(tǒng)計(jì)商品的好評(píng)度可視化效果
圖4 統(tǒng)計(jì)用戶粘度
對(duì)數(shù)據(jù)結(jié)果進(jìn)行可視化展示,使用Java編寫代碼展示訪問量前5的網(wǎng)頁,效果如圖5所示。
圖5 統(tǒng)計(jì)用戶粘度可視化效果
(3)分析用戶最喜歡購(gòu)買的商品
對(duì)于已經(jīng)登錄的用戶,根據(jù)用戶的基本信息如年齡段、性別、職業(yè)等,分析出用戶最喜歡購(gòu)買的商品,從而將這些商品有目標(biāo)的推送給不同用戶展示,提高交易成功率,優(yōu)化網(wǎng)站建設(shè)。本條分析統(tǒng)計(jì)不同年齡段不同性別消費(fèi)金額最多的商品種類,年齡和性別來自用戶維表(user),消費(fèi)金額來自銷售事實(shí)表(sale),商品種類來自商品維表(shop),用戶維表和銷售事實(shí)表根據(jù)用戶ID關(guān)聯(lián),銷售事實(shí)表和商品維表根據(jù)商品ID關(guān)聯(lián),根據(jù)年齡段和性別分組,統(tǒng)計(jì)出消費(fèi)金額最多的商品種類,分析語句如下:
select t.sex as`性別`,t.age as`年齡段`,y.kid2 as`商品類別`from(select elect*,row_number()over(partition by c.sex,c.age order by c.money desc)as rank from(select a.sex,a.age,b.goods_id,b.money from(select s.age,s.sex,s.id from(select case when range_age<=30 then'<=30'when range_age>30 and range_age<=50 then'30-50'when range_age>=50 then'>=50'end as age,sex,userid as id from user)s group by s.age,s.sex,s.id)a join(select sum(money*num)as money,goods_id,us?er_id from sale group by goods_id,user_id)b on a.id=b.user_id group by a.sex,a.age,b.goods_id,b.money)c)z where z.rank<=1)t join shop y on t.goods_id=y.goods_id;
運(yùn)行結(jié)果如圖6所示。
由結(jié)果可知,不同年齡段不同性別的用戶最喜歡購(gòu)買的商品種類,基于大數(shù)據(jù)分析結(jié)果,再將同類目下的商品推薦給顧客,就可以達(dá)到優(yōu)化網(wǎng)站建設(shè),提高用戶體驗(yàn)度的效果。
圖6 不同年齡段不同性別用戶喜歡購(gòu)買的商品
電商網(wǎng)站每日產(chǎn)生的用戶數(shù)據(jù)正呈指數(shù)性增長(zhǎng),如何從這么大規(guī)模的數(shù)據(jù)量中分析挖掘出有價(jià)值的信息,反饋網(wǎng)站建設(shè)優(yōu)化,給用戶帶來更好的使用體驗(yàn),這給技術(shù)帶來了挑戰(zhàn)。隨著大數(shù)據(jù)平臺(tái)的日漸成熟和普及,能夠輕松實(shí)現(xiàn)TB級(jí)數(shù)據(jù)的存儲(chǔ)、PB級(jí)數(shù)據(jù)的查詢分析,為海量數(shù)據(jù)的分析預(yù)測(cè)提供了技術(shù)手段。本文基于業(yè)界流行的華為大數(shù)據(jù)平臺(tái),對(duì)電商網(wǎng)站數(shù)據(jù)進(jìn)行了三個(gè)角度的分析,先進(jìn)行數(shù)據(jù)清洗,再使用HQL語言做統(tǒng)計(jì)分析,最后使用Java呈現(xiàn)可視化分析結(jié)果,為Web網(wǎng)站建設(shè)優(yōu)化提供了數(shù)據(jù)支持,本文下一步將繼續(xù)研究更復(fù)雜的分析角度,采用編寫MapReduce程序?qū)崿F(xiàn)復(fù)雜分析。