大数据实验-电影评分分析
1. 将数据集放入HDFS中
在hdfs中创建存放数据集的文件夹 (这里文件夹为:/data/13/5)
hdfs dfs -mkdir -p /data/13/5/
先把数据集放到当前服务器的文件夹(/home/anaconda/code/)中,在此文件夹中打开终端(5/:为数据集所在的文件夹,/data/13/5/:hdfs路径)
hdfs dfs -put 5/* /data/13/5/
查看是否已放入
hdfs dfs -cat /data/13/5/info/info.csv | head -5
2. 创建数据库并导入数据
启动beeline
beeline -u 'jdbc:hive2://localhost:10000' -n root -p 123456
创建数据库
create database bigdata_cases;
show databases;
选择该数据库
use bigdata_cases;
创建表:
这里需要创建两个表,分别是影片信息和影片评分。movie_info 和 movie_rating
movie_rating:(在hdfs上的路径为/data/13/5/rating/rating.csv)
各字段的定义为:
字段 | 定义 |
---|---|
MovieId | 影片标识符 |
UserId | 用户标识符 |
Grade | 用户评分,只可能是1、2、3、4和5中的一种 |
RatingTime | 评分时间 |
create external table movie_rating
(MovieId STRING,
UserId STRING,
Grade STRING,
RatingTime Date
)
row format delimited fields terminated by '\t'
stored as textfile
location '/data/13/5/rating';
movie_info:(在hdfs上的路径为/data/13/5/info/info.csv)
各字段的定义为:
字段 | 定义 |
---|---|
MovieId | 影片标识符 |
Year | 影片发行年份 |
Title | 影片名称 |
create external table movie_info
(MovieId STRING,
Year STRING,
Title STRING
)
row format delimited fields terminated by '\t'
stored as textfile
location '/data/13/5/info';
来查一下movie_rating表中一些数据
select count(*) from movie_rating;
select * from movie_rating limit 5;
查看一下movie_info的数据
select * from movie_info lilmit 5;
3. 统计所有2000年以后上映影片的平均评分和评分数
hive -e \
"select b.Title, a.MovieId, avg(Grade) as AverageGrade, count(1) as CountGrade
from bigdata_cases.movie_rating a
inner join bigdata_cases.movie_info b on a.MovieId=b.MovieId and b.Year>=2000
group by b.Title, a.MovieId
order by AverageGrade desc,CountGrade desc;" \
> 1.csv
查看输出文件1.csv:
head -5 1.csv
没有问题!
4. 得到平均评分前5的影片的所有评分
得到平均评分前5的影片的所有评分,为之后做数据可视化做准备。
执行以下Hive-QL代码:
hive -e \
"select b.Title, a.MovieId, a.Grade
from bigdata_cases.movie_rating a
inner join bigdata_cases.movie_info b on a.MovieId=b.MovieId
where a.MovieId in (14961, 7230, 7057, 3456, 9864);" \
> 2.csv
得到结果的前10行:
head -10 2.csv
还是没有问题!
5. 得到平均评分前5的影片的在上映第一年每天的平均评分、评分标准差和评分数
得到平均评分前5的影片的在上映第一年每天的平均评分、评分标准差和评分数。
执行以下Hive-QL代码:
hive -e \
"select b.Title, a.MovieId, round((unix_timestamp(concat(a.RatingTime,' 00:00:00'))-b.RatingStart) / (3600 * 24 *7)) as Week,
avg(a.Grade) as AverageGrade, stddev(a.Grade) as DevGrade, count(1) CountGrade
from bigdata_cases.movie_rating a
inner join (
select a1.MovieId, b1.Title, min(unix_timestamp(concat(a1.RatingTime,' 00:00:00'))) as RatingStart
from bigdata_cases.movie_rating a1
inner join bigdata_cases.movie_info b1 on a1.MovieId=b1.MovieId
where a1.MovieId in (14961, 7230, 7057, 3456, 9864)
group by a1.MovieId, b1.Title) b on a.MovieId=b.MovieId
where unix_timestamp(concat(a.RatingTime,' 00:00:00'))-b.RatingStart<=3600*24*7*52
group by b.Title, a.MovieId, round((unix_timestamp(concat(a.RatingTime,' 00:00:00'))-b.RatingStart) / (3600 * 24 * 7));" \
> 3.csv
得到结果的前10行:
head -10 3.csv
仍然没有问题!
6. 统计所有用户的平均评分和评分数
统计所有用户的平均评分和评分数。
执行以下Hive-QL代码:
hive -e \
"select UserId, count(1) as CountGrade, avg(Grade) as AverageGrade
from bigdata_cases.movie_rating
group by UserId
order by CountGrade desc,AverageGrade desc;" \
> 4.csv
查看一下数据:
head 4.csv
依旧没有问题!
7. 得到评分数前5的用户的所有评分
得到评分数前5的用户的所有评分,为之后做数据可视化做准备。
执行以下Hive-QL代码:
hive -e \
"select UserId, Grade
from bigdata_cases.movie_rating a
where UserId in (305344, 387418, 2439493, 1664010, 2118461);" \
> 5.csv
查看以下5.csv:
head -10 5.csv
没有问题!!!至此所需要的csv都有了!
8. 用R语言做数据可视化
所需数据集放到对应文件夹中D:\data\gsy\
画出所有2000年以后上映影片的平均评分的直方图
library(ggplot2)
data1 <- read.table("D:/data/gsy/movie/1.csv", comment.char = "", sep = "\t", stringsAsFactors = FALSE)
names(data1) <- c("Title", "MovieId","AverageGrade", "CountGrade")
ggplot(data1, aes(x = AverageGrade)) + geom_histogram(aes(fill = ..count..)) + scale_fill_gradient("Count", low = "green", high = "red")
画出所有2000年以后上映影片的评分数的直方图,其中横坐标为对数尺度表示访问量,纵坐标为平方根尺度表示域名的数量。
ggplot(data1, aes(x = CountGrade)) + geom_histogram(aes(fill = ..count..)) + scale_fill_gradient("Count", low = "green", high = "red") + scale_x_log10()
画出平均评分前5的影片评分的分布柱状图
画出平均评分前5的影片评分的分布柱状图,其中横坐标表示不同影片,纵坐标为对数尺度表示评分的累积百分比,颜色表示不同评分。
data2 <- read.table("D:/data/gsy/movie/2.csv", sep = "\t")
names(data2) <- c("Title", "MovieId", "Grade")
data2$Grade <- as.factor(data2$Grade)
ggplot(data2, aes(x = Title, fill = Grade)) + geom_bar(position = "fill") + scale_y_log10()
画出平均评分前5的影片的在上映第一年每周的平均评分、评分标准差和评分数
画出平均评分前5的影片的在上映第一年每周的平均评分、评分标准差和评分数,其中横坐标表示距离影片收到第一条评分过的周数,纵坐标表示影片的平均评分,线条粗细表示评分数,灰色区域表示影片平均评分的95%置信区间。
data3 <- read.table("D:/data/gsy/movie/3.csv", sep = "\t")
names(data3) <- c("Title", "MovieId", "Day", "AverageGrade", "DevGrade", "CountGrade")
ggplot(data3, aes(x = Day, y = AverageGrade, group = Title)) + geom_smooth(aes(ymin = AverageGrade - 1.96 * DevGrade, ymax = AverageGrade - 1.96 * DevGrade, colour = Title), size = 2) + xlim(0, 45)
画出所有用户平均评分和评分数的直方图
画出所有用户平均评分的直方图,其中横坐标表示平均评分,纵坐标表示用户的数量。
data4 <- read.table("D:/data/gsy/movie/4.csv", sep = "\t", stringsAsFactors = FALSE)
names(data4) <- c("UserId", "CountGrade", "AverageGrade")
ggplot(data4, aes(x = AverageGrade)) + geom_histogram(aes(fill = ..count..)) +
+ scale_fill_gradient("Count", low = "green", high = "red")
画出所有用户评分数的直方图,其中横坐标表示平均评分,纵坐标为对数尺度表示用户的数量。
ggplot(data4, aes(x = CountGrade)) + geom_histogram(aes(fill = ..count..)) +
+ scale_fill_gradient("Count", low = "green", high = "red") + scale_x_log10()
f. 画出评分数前5的用评分的分布柱状图
画出评分数前5的用评分的分布柱状图,其中横坐标表示不同用户,纵坐标表示评分的累积百分比,颜色表示不同评分。
data5 <- read.table("D:/data/gsy/movie/5.csv", sep = "\t")
names(data5) <- c("UserId", "Grade")
data5$Grade <- as.factor(data5$Grade)
ggplot(data5, aes(x = as.factor(UserId), fill = Grade)) + geom_bar(position = "fill")