大數據實驗-電影評分分析
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")

