一、网页分析
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项目,项目结构如下:
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/,然后回车,如果成功的话,会显示如下图所示画面:
切换到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