大数据-电影评分分析


大数据实验-电影评分分析

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

image

2. 创建数据库并导入数据

启动beeline

beeline -u 'jdbc:hive2://localhost:10000' -n root -p 123456

创建数据库

create database bigdata_cases;
show databases;

image

选择该数据库

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;

image

select * from movie_rating limit 5;

image

查看一下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

image

查看输出文件1.csv:

head -5 1.csv

image

没有问题!

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

image

得到结果的前10行:

head -10 2.csv

image

还是没有问题!

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

image

得到结果的前10行:

head -10 3.csv

image

仍然没有问题!

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

image

查看一下数据:

head 4.csv

image

依旧没有问题!

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

image

查看以下5.csv:

head -10 5.csv

image

没有问题!!!至此所需要的csv都有了!

8. 用R语言做数据可视化

所需数据集放到对应文件夹中D:\data\gsy\

image

画出所有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")

image

画出所有2000年以后上映影片的评分数的直方图,其中横坐标为对数尺度表示访问量,纵坐标为平方根尺度表示域名的数量。

ggplot(data1, aes(x = CountGrade)) + geom_histogram(aes(fill = ..count..)) + scale_fill_gradient("Count", low = "green", high = "red") + scale_x_log10()

image

画出平均评分前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()

image

画出平均评分前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)

image

画出所有用户平均评分和评分数的直方图

画出所有用户平均评分的直方图,其中横坐标表示平均评分,纵坐标表示用户的数量。

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")

image

画出所有用户评分数的直方图,其中横坐标表示平均评分,纵坐标为对数尺度表示用户的数量。

ggplot(data4, aes(x = CountGrade)) + geom_histogram(aes(fill = ..count..)) + 
+     scale_fill_gradient("Count", low = "green", high = "red") + scale_x_log10()

image

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")

image


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM