大數據-電影評分分析


大數據實驗-電影評分分析

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