1. 程式人生 > >基於Spark和Hive進行的豆瓣電影資料分析

基於Spark和Hive進行的豆瓣電影資料分析

寫在前邊的話:

       算是自己做的一個小課題吧,自己搭建平臺,自己爬取資料,自己進行資料清洗和分析,自己進行視覺化展示,寫這篇部落格不為別的,只是記錄下自己做這個課題的整個過程,大神們勿噴

       環境說明:hadoop2.7叢集,包含Hbase,Hive,Spark,Sqoop,Mahout元件

       過       程:平臺部署->資料採集-> 資料儲存->資料ETL->資料分析->視覺化

1:平臺部署

     看之前的部落格:點選閱讀

2:資料採集

      資料來源,豆瓣電影,以Tag採集入口,對應標籤採集對應的電影,使用Python3.4.3 + BeautifulSoup4.4.1 + urllib進行資料

的採集,本地儲存形式為csv格式,程式碼結構為

-DouBan-Spider         #專案根目錄
----download           #下載網頁原始碼模組
--------__init__.py 
-------down_html.py 
----fileoutput         #檔案輸出儲存路徑
----output             #將抓取的內容寫入檔案
--------__init__.py
--------output_all.py
----parase             #解析網頁程式碼
--------__init__.py
--------parase_html.py
----urlmanager         #連結管理
--------__init__.py
--------manage_url.py
----main
         資料儲存格式(csv檔案)

       category.csv,兩列(標籤name,對應的電影數目)

       

       movie.csv,10列(電影ID,名字,導演,編劇,型別,主演,上映時間,時長,評論人數,豆瓣評分)

       

       movie_summary.txt,兩列(電影ID,劇情摘要)

       

3:資料儲存

      首先爬取的資料是儲存在本地電腦上的,我們將其上傳至HDFS,作為原始資料儲存

      上傳至HDFS:

    bin/hdfs dfs -put /home/master/桌面/*.csv /file/douban_movie_data
    bin/hdfs dfs -put /home/master/桌面/*.txt /file/douabn_movie_data
       web檢視顯示為:


4:資料ETL

     1) category.csv直接可放入hive中,建立category表,並載入資料

         PS:這裡要注意的是,這樣不做任何處理直接載入到hive表中,在進行終端查詢時會出現亂碼情況

         解決辦法:將本地檔案另存為UTF-8格式,然後再進行匯入到Hive中

#建立category資料表
create table movie_category(
	cate_name string,
	cate_count int
)
comment "this table about movie category"
row format delimited fields terminated by ",";

#將category.csv載入到表中
load data inpath '/file/douabn_movie_data/category.csv' into table movie_category;

      2) 對movie_links.csv 進行預處理,提取出id,進行hive的兩列式儲存

      預處理

#-*-codinf:utf-8-*-

fp_w = open("new_movies_links.csv","a")

with open("movies_links.csv" ,"r") as fp:
    links = fp.readlines()
    for link in links:
        id = link.strip().split("/")[-2]
        href = link
        fp_w.write(id+"," +href)

fp_w.close()
print "ETL OK" 
     建立表movie_links,並載入資料
#建立表movie_links
create table movie_links(
id int,
href string
)
comment "this table about every movie links"
row format delimited fields terminated by ",";
#從本地載入資料
load data local inpath "/home/master/mycode/new_movies_links.csv" into table movie_links;

      3) 對movie.csv進行預處理,並存入hive

          預處理

# -*-coding:utf-8-*-

#encoding="utf-8"  保證匯入hive之後查詢時不會出現中文亂碼
fp_w = open("new_movies_load.csv","a",encoding="utf-8")

with open("movie.csv","r") as fp_r:
    for line in fp_r.readlines():
        movies=line.strip().split(",")

        s = ""
        #對上映時間進行處理
        try:
            year = int(movies[6].replace("/","-").split("-")[0])
        except:
            yesr = ""
        try:
            month = int(movies[6].replace("/","-").split("-")[1])
        except:
            month = ""
        movies[6] = str(year) + "," + str(month)
        for m in movies:
            s += m+","
        fp_w.write(s[:-1]+"\n")
    print("OK !!!")
    fp_w.close()
        建立movie_message表,並載入資料
#建立儲存表
create table movie_message(
    id int,
	title string,
	daoyan array<string>,
	bianju array<string>,
	leixing array<string>,
	zhuyan array<string>,
	year int,
	month int,
	shichang int,
	disnum int,
	score float
)
comment "this table about movie's message"
row format delimited fields terminated by ","
collection items terminated by '/';
#載入資料
load data local inpath "/home/master/mycode/new_movies_load.csv" into table movie_message;

      4) 建立movie_summary表,並載入資料

#載入資料
load data local inpath "/home/master/mycode/new_movies_load.csv" into table movie_message;

#建立劇情摘要表
create table movie_summary(
id int,
summary string
)
comment "this table about movie summary"
row format delimited fields terminated by "\t";
#載入資料
load data local inpath "/home/master/mycode/movie_summary.txt" into table movie_summary;<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">     </span>

       5) 影評資料存入表中(以大魚海棠為例,下邊也將以大魚海棠作為分析入口)

5:資料分析

    1):電影類別統計

          根據標籤和對應的電影數目,進行Top10顯示,如下:

   

    2):電影劇情統計

   

    3):厲年影片數量走勢圖

 

    4):電影數目最多的十年

  

    5):影評分析

         首先將影評資訊進行初步的ETL存入hive資料表,方便分析時直接匯出需要的列即可,下面直接給出分析結果,程式碼和原始檔參考github,連結在部落格開頭已給出。

        (1):影價等級比例

       

        (2):影評時間分析

       

        (3):影評高頻詞統計

        使用spark進行中文分詞統計請移步:點選閱讀,jar包下載:github                 

        (4):劇透類影評分析

               內容為”這篇影評可能有劇透“在所有的影評中所佔的比例

               hive中執行:

select
round(sum(case when content="這篇影評可能有劇透" then 1 else 0 end)/count(*),2)
from yingping_dayu;
                    結果為:0.43

               內容為”這篇影評可能有劇透“在每天中的數目變化

          

             我們可以將影評變化和劇透影評在一張圖上顯示如下:

             

        (5):影評情感分類

           這個部分主要是針對每個影評進行自動評級,豆瓣電影對影評的評級分為五個等級('很差','較差','還行','推薦','力薦'),這裡使用的是樸素貝葉斯分類演算法,首先對每個等級的影評進行分詞,提取高頻詞作為分類的依據

          第一步:針對影評的等級和影評內容分詞並寫入相應的檔案

          程式碼就不貼了(github上有),處理結果如下:

       

         0代表很差,依次類推,5代表力薦

         第二步:結合樸素貝葉斯演算法和以上的資料,進行學習分類

         把需要分類的影評寫入test.txt檔案,然後執行程式,結果顯示如圖(紅色部分為中文分詞的過程,不必理會):

         

          需要說明的是,這裡分類的效果很差,原因是豆瓣影評分級的依據是自己提取的高頻詞,但是從某種程度上說,這是不靠譜的,如果大家有什麼好的意見可以提一下,一起學習。

附:分享一個針對豆瓣電影資料做的比較好看的視覺化web展示:  http://zhanghonglun.cn/data-visualization/

          但是上邊的連結所展示的不足之處為資料為靜態的,即不能實時的從豆瓣獲取資料,而且展示的資料維度比較單一