关闭

基于Spark和Hive进行的豆瓣电影数据分析

标签: 数据分析SparkHive中文分词
6877人阅读 评论(12) 收藏 举报
分类:

写在前边的话:

       算是自己做的一个小课题吧,自己搭建平台,自己爬取数据,自己进行数据清洗和分析,自己进行可视化展示,写这篇博客不为别的,只是记录下自己做这个课题的整个过程,大神们勿喷

       环境说明:hadoop2.7集群,包含Hbase,Hive,Spark,Sqoop,Mahout组件

       过       程:平台部署->数据采集-> 数据存储->数据ETL->数据分析->可视化

       课题github地址:https://github.com/Thinkgamer/Douban_Movies_Analysi  (主要是源代码部分)


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/

          但是上边的链接所展示的不足之处为数据为静态的,即不能实时的从豆瓣获取数据,而且展示的数据维度比较单一

3
0
查看评论

[大数据]使用hive做数据分析

前面使用flume把第一手的日志上传到了hadoop 接下来就是要对数据进行分析了, 这里可以使用hadoop的mapreduce,但是缺点是开发过程比较慢 很多人都习惯使用sql来进行查询,hive很好的满足了这个要求 而且根据大公司的精力,之前大家都是使用自己封装的mapreduce库 后来都转...
  • xnby
  • xnby
  • 2016-04-27 17:15
  • 1824

利用Hive进行数据分析

近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上的行业标准之一。面对当今互联网产生的巨大的TB甚至PB级原始数据,利用基于Hadoop的数据仓库解决方案Hive早已是Hadoop的热点应用之一。达观数据团队长期致力于研究和积累Hadoop系统的技术和经验,并构建起了分布...
  • wh_springer
  • wh_springer
  • 2016-07-06 21:30
  • 7698

干货长文 | 达观数据分析平台架构和Hive实践

干货长文 | 达观数据分析平台架构和Hive实践 2016-02-25 文辉 大数据杂谈 “ 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上的行业标准之一。面对当今互联网产生的巨大的TB甚至PB级原始数据,利用基于Hadoop...
  • xiao_jun_0820
  • xiao_jun_0820
  • 2016-02-26 16:57
  • 1014

Spark简单数据分析---Spark学习笔记(2)

上次学习Spark还是两个月前的事情,期中好多事情耽搁了,现在开始正式地学习Spark的使用。前面所学习的Scala基本知识也能用上了,终于可以从简单了解过渡到应用和实现的阶段。 这次学习的内容跟进的是《Spark高技术据分析》一章,里面的内容感觉很灵活,不仅是从最简单的Spark对数据...
  • miaote
  • miaote
  • 2017-01-07 16:22
  • 1833

『 Spark 』7. 使用 Spark DataFrame 进行大数据分析

写在前面 本系列是综合了自己在学习spark过程中的理解记录 + 对参考文章中的一些理解 + 个人实践spark过程中的一些心得而来。写这样一个系列仅仅是为了梳理个人学习spark的笔记记录,所以一切以能够理解为主,没有必要的细节就不会记录了,而且文中有时候会出现英文原版文档,只要不影响理解,都不...
  • weimingyu945
  • weimingyu945
  • 2017-09-14 16:50
  • 195

sparksql与hive整合

hive配置编辑 $HIVE_HOME/conf/hive-site.xml,增加如下内容:<property> <name>hive.metastore.uris</name> <value>thrift://master:9083</...
  • stark_summer
  • stark_summer
  • 2015-09-14 18:33
  • 37827

总结:Hive,Hive on Spark和SparkSQL区别

Hive on Mapreduce Hive的原理大家可以参考这篇大数据时代的技术hive:hive介绍,实际的一些操作可以看这篇笔记:新手的Hive指南,至于还有兴趣看Hive优化方法可以看看我总结的这篇Hive性能优化上的一些总结 Hive on Mapreduce执行流程 执行流程详细...
  • MrLevo520
  • MrLevo520
  • 2017-08-04 22:36
  • 5014

Spark SQL和Hive使用场景?

作者:狗叔 链接:https://www.zhihu.com/question/36053025/answer/121404733 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 Hive是什么?一个建立在分布式存储系统(这里指HDFS)上的SQL引擎。 为什么要有Hive...
  • u013063153
  • u013063153
  • 2016-12-12 15:50
  • 3621

spark 使用hive metastore

有3,4个月没接触hadoop和spark了,有些生疏,实习时用的是nodejs+python,今天休假,在新电脑跑跑大数据(真不敢相信我以前使用赛扬双核内存4G + 核显跑几个虚拟机来运行hadoop和spark的,跑个任务或者编译android源码有时等得蛋疼...) 虽然这些步骤常用...
  • u013571243
  • u013571243
  • 2016-10-12 09:55
  • 2055

从Hive处理日志到可视化到实时

Hive
  • wedy542700927
  • wedy542700927
  • 2017-06-09 11:24
  • 673
    微信公众号【数据与算法联盟】

    扫码关注公众号,不定期推送实战文章!

    扫码加我微信,拉你进数据算法大佬群!
    个人资料
    • 访问:1066113次
    • 积分:11758
    • 等级:
    • 排名:第1530名
    • 原创:227篇
    • 转载:22篇
    • 译文:2篇
    • 评论:343条
    个人简介
    姓名:Thinkgamer

    Github:https://github.com/thinkgamer

    主攻:云计算/python/数据分析

    程度:熟悉/熟悉/熟悉

    微信:gyt13342445911

    Email:thinkgamer@163.com

    工作状态:在职ing

    心灵鸡汤:只要努力,你就是下一个大牛...

    hadoop/spark/机器学习群:279807394(大神建的群,蹭个管理员)

    欢迎骚扰........
    博客专栏
    最新评论