结课项目:IMDb网站Top250电影数据分析及可视化、对某一部电影的评论形成高频词字符云、监控评论、对该电影推荐用户(暂定)

一、网页分析

1. Top250页面分析

2. 电影Pulp Fiction评论页面分析

二、Java WebMagic爬取信息

1. 爬取Top250电影的详细信息,以键值对形式保存为Json文件

2. 爬取电影Pulp Fiction的用户评论信息,以键值对形式保存为Json文件

三、数据清洗

将保存在本地的Json文件上传到HDFS中:

hadoop fs -mkdir -p /myimdb/movie/in
hadoop fs -put /data/imdb1/movie/www.imdb.com/* /myimdb/comment/in

hadoop fs -mkdir -p /myimdb/comment/in
hadoop fs -put /data/imdb1/comment/www.imdb.com/* /myimdb/comment/in

MapReduce对数据清洗:读取Json文件、去重、去除空值、生成格式化的数据文件:

 

四、利用Hive进行电影信息的数据分析

在Hive中创建imdb数据库:

create database imdb;

创建外部表movies:

create external table if not exists movies (
movie_name string,
movie_year int,
movie_area string,
movie_type string,
movie_score float,
movie_director string
) row format delimited fields terminated by '\t' location '/myimdb/movie/out/1';

创建外部表comments:

create external table if not exists comments (
comm_username string,
comm_score int,
comm_title string,
comm_detail string
) row format delimited fields terminated by '\t' location '/myimdb/cmments/out/1';

将格式化的数据文件下载到本地:

cd /data/imdb1/movie/
hadoop fs -get /myimdb/movie/out/1/*

cd /data/imdb1/comment/
hadoop fs -get /myimdb/comment/out/1/*

将数据导入到Hive的movies表中:

load data local inpath '/data/imdb1/movie/part-r-00000' into table movies;
select * from movies limit 5;   //查看数据,验证是否导入成功

load data local inpath '/data/imdb1/comment/part-r-00000' into table comments;
select * from comments limit 5;   //查看数据,验证是否导入成功

统计共有多少条目:

select count(1) as num from movies;

select count(1) as num from comments;

创建score_movienum表,统计各个评分分别有多少部电影,将统计结果以临时文件形式保存到score_movienum表中:

create table score_movienum (movie_score float, num int)
row format delimited fields terminated by '\t' stored as textfile;

insert into table score_movienum select movie_score, count(1) as num
from movies group by movie_score;

select * from score_movienum;

创建year_movienum表,统计各个年代分别有多少部电影,将统计结果以临时文件形式保存到year_movienum表中:

create table year_movienum (movie_year int, num int)
row format delimited fields terminated by '\t' stored as textfile;

insert into table year_movienum select movie_year, count(1) as num
from movies group by movie_year;

select * from year_movienum;

创建type_movienum表,统计各个类型分别有多少部电影,将统计结果以临时文件形式保存到type_movienum表中:

create table type_movienum (movie_type string, num int)
row format delimited fields terminated by '\t' stored as textfile;

insert into table type_movienum select movie_type, count(1) as num
from movies group by movie_type;

select * from type_movienum;

创建area_movienum表,统计各个类型分别有多少部电影,将统计结果以临时文件形式保存到area_movienum表中:

create table area_movienum (movie_area string, num int)
row format delimited fields terminated by '\t' stored as textfile;

insert into table area_movienum select movie_area, count(1) as num
from movies group by movie_area;

select * from area_movienum;

创建detail_comment表,将用户的评论内容以临时文件形式保存到detail_comment表中:

create table alldetail_comment (comm_username string, comm_score int, comm_title string, comm_detail string)
row format delimited fields terminated by '\t' stored as textfile;

insert into table alldetail_comment select comm_username,comm_score,comm_title,comm_detail
from comments;

select * from alldetail_comment;

五、利用Sqoop将分析结果导入MySql

测试sqoop是否可以正常使用:

sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password nothing

开启MySql,在mysql中创建数据库imdb:

create database imdb;

创建movies表:

create table movies(
movie_id int(10) auto_increment primary key,
movie_name varchar(100),
movie_year int(10),
movie_area varchar(100),
movie_type varchar(100),
movie_score float(10),
movie_director varchar(100),
);

创建comments表:

create table comments(
comm_id int(10) auto_increment primary key,
comm_username varchar(100),
comm_score int(10),
comm_title varchar(100),
comm_detail varchar(10000),
);

创建alldetail_comment表,用来储存hive中alldetail_comment表的数据,再新开启一个终端模拟器,使用Sqoop命令将Hive中的alldetail_comment表导入到Mysql的alldetail_comment表中,然后在mysql命令行下测试是否导入成功:

create table alldetail_comment (comm_username varchar(100),comm_score int(10),comm_title varchar(100),comm_detail varchar(10000));

sqoop export \  
--connect jdbc:mysql://localhost:3306/imdb?characterEncoding=UTF-8 \
--username root \
--password nothing \
--table alldetail_comment \
--export-dir /user/hive/warehouse/alldetail_comment \
--input-fields-terminated-by '\t'

select * from alldetail_comment;

创建score_movienum表,用来储存hive中score_movienum表的数据,再新开启一个终端模拟器,使用Sqoop命令将Hive中的score_movienum表导入到Mysql的score_movienum表中,然后在mysql命令行下测试是否导入成功:

create table score_movienum (movie_score float(10), num int);

sqoop export \  
--connect jdbc:mysql://localhost:3306/imdb?characterEncoding=UTF-8 \
--username root \
--password nothing \
--table score_movienum \
--export-dir /user/hive/warehouse/score_movienum \
--input-fields-terminated-by '\t'

select * from score_movienum;

创建year_movienum表,用来储存hive中year_movienum表的数据,再新开启一个终端模拟器,使用Sqoop命令将Hive中的year_movienum表导入到Mysql的year_movienum表中,然后在mysql命令行下测试是否导入成功:

create table year_movienum (movie_year int(10), num int);

sqoop export \  
--connect jdbc:mysql://localhost:3306/imdb?characterEncoding=UTF-8 \
--username root \
--password nothing \
--table year_movienum \
--export-dir /user/hive/warehouse/year_movienum \
--input-fields-terminated-by '\t'

select * from year_movienum;

创建type_movienum表,用来储存hive中type_movienum表的数据,再新开启一个终端模拟器,使用Sqoop命令将Hive中的year_movienum表导入到Mysql的year_movienum表中,然后在mysql命令行下测试是否导入成功:

create table type_movienum (movie_type varchar(100), num int);

sqoop export \  
--connect jdbc:mysql://localhost:3306/imdb?characterEncoding=UTF-8 \
--username root \
--password nothing \
--table type_movienum \
--export-dir /user/hive/warehouse/type_movienum \
--input-fields-terminated-by '\t'

select * from type_movienum;

创建area_movienum表,用来储存hive中area_movienum表的数据,再新开启一个终端模拟器,使用Sqoop命令将Hive中的area_movienum表导入到Mysql的area_movienum表中,然后在mysql命令行下测试是否导入成功:

create table area_movienum (movie_area varchar(100), num int);

sqoop export \  
--connect jdbc:mysql://localhost:3306/imdb?characterEncoding=UTF-8 \
--username root \
--password nothing \
--table area_movienum \
--export-dir /user/hive/warehouse/area_movienum \
--input-fields-terminated-by '\t'

select * from area_movienum;
//删除表中空值
delete from area_movienum where movie_area is null;

//更改数据
update comm_des set useful_words='Quentin' where useful_words='the';

六、使用结巴分词对岗位描述进行分词并将关键词统计

安装jieba、pymysql到python环境:

pip install --user jieba  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install --user pymysql  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

将MySql中alldetail_comment表导出为csv格式的文件:

select * from alldetail_comment
into outfile '/var/lib/mysql-files/alldetail_comment.csv'   //保存的文件路径,需要有读写权限
fields terminated by ','    //字段间以,分隔
optionally enclosed by '"'  //字段用"号括起
escaped by '"'         //字段中使用的转义符为"
lines terminated by '\n';  //行以\n结束(windowd使用\r\n)

这里需要注意,mysql 默认对导出的目录有权限限制,也就是说使用命令行进行导出的时候,需要指定目录进行操作。但是指定其他目录会报错:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement。

这里使用show global variables like '%secure%';查询到secure_file_priv的路径,需要把导出文件放到该目录下,再将其拷贝到需要用到的目录即可。

 此时需要切换到root用户,将刚才保存的文件拷贝出来,否则user用户对文件目录是没有访问权限的:

sudo su
cp /var/lib/mysql-files/alldetail_comment.csv /data/imdb1/comment/

exit  //退出root用户,如果exit不能退出,直接ctrl+D

 在MySql端,切换到imdb库,创建comm_des表:

use imdb;
create table comm_des(useful_words varchar(20),num int);
desc comm_des;

编写Python代码,结巴分词后并进行词频统计,获取高频词,并存入MySql的comm_des表中:

 

七、用Echars对电影数据可视化

新建JavaWeb项目,项目结构如下:

结课项目:IMDb网站Top250电影数据分析及可视化、对某一部电影的评论形成高频词字符云、监控评论、对该电影推荐用户(暂定)_第1张图片

1. 用Echars对电影类型统计结果制作饼状图

在my.domain包下,First类的作用为:movie_type和num对象,封装定义其属性:

在my.dao包下,FirstDao.java类的作用为:调用sql语句对数据库的数据进行具体操作:

在my.manager包下,FirstManager.java类的作用为:用以调用FirstDao中的方法得到数据:

在my.servlet包下,FirstServlet.java类的作用为:将前面得到的数据传给jsp页面,响应客户端:

main.properties文件的作用为,配置MySQL相关参数,涉及用户名、密码、数据库等:

在WebContent/keshihua/下面新建一个jsp页面,命名为first,这个页面就是在浏览器上展现给客户的页面,在这个页面上接收后台数据,主要作用是实现数据的可视化展现:

 

2. 用Echars对电影评分统计结果制作柱状图

在my.domain包下,Second类的作用为:movie_score和num对象,封装定义其属性:

在my.dao包下,SecondDao.java类的作用为:调用sql语句对数据库的数据进行具体操作:

在my.manager包下,SecondManager.java类的作用为:用以调用SecondDao中的方法得到数据:

在my.servlet包下,SecondServlet.java类的作用为:将前面得到的数据传给jsp页面,响应客户端:

main.properties文件的作用为,配置MySQL相关参数,涉及用户名、密码、数据库等:

在WebContent/keshihua/下面新建一个jsp页面,命名为second,这个页面就是在浏览器上展现给客户的页面,在这个页面上接收后台数据,主要作用是实现数据的可视化展现:

 

3. 用Echars对电影年代统计结果制作折线图

在my.domain包下,Third类的作用为:movie_year和num对象,封装定义其属性:

在my.dao包下,SecondDao.java类的作用为:调用sql语句对数据库的数据进行具体操作:

在my.manager包下,ThirdManager.java类的作用为:用以调用ThirdDao中的方法得到数据:

在my.servlet包下,ThirdServlet.java类的作用为:将前面得到的数据传给jsp页面,响应客户端:

main.properties文件的作用为,配置MySQL相关参数,涉及用户名、密码、数据库等:

在WebContent/keshihua/下面新建一个jsp页面,命名为third,这个页面就是在浏览器上展现给客户的页面,在这个页面上接收后台数据,主要作用是实现数据的可视化展现:

 

4. 用Echars对电影地域统计结果制作地区热力图

5. 用Echars对评论获取的高频词分析结果制作字符云图(java和python两种语言)

JAVA:

将mysql中的comm_des(结巴分词并词频统计后的表)表导出为.txt文件:

select useful_words from comm_des
into outfile '/var/lib/mysql-files/comm_des.txt'   //保存的文件路径,需要有读写权限

 

 

PYTHON 项目:

将MySql中的comm_des表导出为csv文件,再从该目录拷贝至使用目录:

select * from comm_des
into outfile '/var/lib/mysql-files/comm_des.csv'   //保存的文件路径,需要有读写权限

安装wordcloud库:

pip install --user wordcloud

编写python代码:

 

PYTHON DJANGO项目:

在Linux命令行中使用Python包管理工具pip安装最新版的Django版本:

pip install --user django -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

python -m django –version   //查看版本

在python解释器中输入以下命令行,查看Django路径:

import django 
print(djanngo.__path__)

//显示路径:/home/liudm/.local/lib/python3.5/site-packages/django

退出python命令行交互界面,在linux命令行修改系统环境变量,然后更新环境变量:

vim ~/.bashrc

export PATH=/home/liudm/.local/lib/python3.5/site-packages/django:$PATH

source ~/.bashrc

查看是否添加成功:

echo $PATH

新建Django项目:点击Location选项最右边的按键,自由选择项目所在的路径,编辑项目名称。PS:记得勾选“Inherit global site-packages”选项(让自带的site-packages对新建的虚拟环境可见),然后点击create。打开PyCharm的Terminal,输入如下命令行新建一个名为mysite的Django项目:

django-admin startproject myIMDb
cd myIMDb
python manage.py migrate
python manage.py runserver

最后,检测项目是否运行成功,只需打开浏览器,在地址栏输入:http://127.0.0.1:8000/,然后回车,如果成功的话,会显示如下图所示画面: 

结课项目:IMDb网站Top250电影数据分析及可视化、对某一部电影的评论形成高频词字符云、监控评论、对该电影推荐用户(暂定)_第2张图片

切换到linux命令行,执行下面代码,安装python的mysqlclient模块(如果安装失败,可以直接下载对应的轮子文件然后pip命令安装):

sudo apt-get install libmysqlclient-dev
pip install mysqlclient -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

 

安装libmysqlclient-dev这里很容易踩坑,要么就是版本不对,要么就是因为系统问题包名不对,或者轮子文件下载不下来/安装不上,或者缺少需要的lib等等乱七八糟的问题,经过诸多排雷试验终于安装成功,我的方法是(PS:ubuntu 上 mysql-devel 库的名字叫 libmysqld-dev):

pip install wheel
sudo apt-get update
sudo apt-get install python3-dev    //sudo apt-get install python-dev
sudo apt-get install libmysqlclient-dev

sudo apt-get install libmysql     //此处连敲两下Tab,查看匹配的包,以免出现定位不到包的情况
//下面是我匹配到的符合名称条件的包,可以看到我需要安装的是libmysqld-dev
libmysql++3v5        libmysql-cil-dev     libmysqlclient-dev   libmysqlcppconn-dev  libmysql++-dev       libmysql++-doc       libmysql-ocaml       
libmysql6.4-cil      libmysqlclient20     libmysqlcppconn7v5   libmysqld-dev        libmysql-diff-perl   libmysql-java        libmysql-ocaml-dev

sudo apt-get install libmysqld-dev
pip install -user mysqlclient -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
//这个时候再安装mysqlclient就可以成功了

接下来编写Django代码:

在setting.py中更改数据库设置:

在urls.py中进行url设置:

 

八、使用Spark MLlib ALS推荐算法训练模型并实现:

  • 针对用户推荐电影
  • 针对电影推荐用户

安装ipython:

sudo apt-get install ipython

升级pip,安装Jupyter:

pip install --upgrade pip
pip install --user jupyter

运行jupyter:

PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS='notebook'    PYSPARK_PYTHON=python3 pyspark

 

你可能感兴趣的:(结课项目:IMDb网站Top250电影数据分析及可视化、对某一部电影的评论形成高频词字符云、监控评论、对该电影推荐用户(暂定))