HIVE官方案例——电影数据(一)
hive官方案例有一个对电影评分数据的分析,统计一周中的哪一天观影人数最多。
1 数据集
数据集用的是经常见到的 ml-100k,共有 10w 条电影评分记录。下载地址 [4.7MB]
在这篇文章中,假设评分的那天就是观影的那天。
下载压缩包后解压,打开READNE可以看到
u.data -- The full u data set, 100000 ratings by 943 users on 1682 items.
Each user has rated at least 20 movies. Users and items are
numbered consecutively from 1. The data is randomly
ordered. This is a tab separated list of
user id | item id | rating | timestamp.
The time stamps are unix seconds since 1/1/1970 UTC
u.data 就是评分的数据,每一行的数据是 user id, iterm id, rating, timestamp,由 tab 键分隔。用记事本打开可以看到数据如下:
u.data
2 分析
2.1 建表
进入hive命令行,
create table u_data (userid INT, movieid INT, rating INT, unixtime STRING) row format delimited fields terminated by '\t';
2.2 导入数据
load data local inpath '/home/yh/data/u.data' into table u_data;
2.3 建新表
建立一个新表,表的列为userid, movieid, rating, weekday
:
create table u_data_new (userid INT, movieid INT, rating INT, weekday INT) row format delimited fields terminated by '\t';
2.4 用脚本转化旧表数据到新表
2.4.1 创建转化脚本
在文件系统的命令行中依次输入下列命令,创建一个将时间戳转化为星期数( 1,2 ,,7)的python文件
touch weekday_mapper.py
vim weekday_mapper.py
输入以下代码
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('\t')
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '\t'.join([userid, movieid, rating, str(weekday)])
按下键盘上Esc
键,:wq
保存并退出。
2.4.2 在hive中转化
在hive命令行中依次输入
add file /home/yh/scripts/weekday_mapper.py
insert overwrite table u_data_new select transform (userid,movieid,rating,unixtime) using 'python weekday_mapper.py' as (userid,movieid,rating,weekday) from u_data;
2.5 查询
select weekday ,count(1) count from u_data_new group by weekday order by count desc;
命令执行完的输出结果如下图所示
3 可视化
3.1查询结果保存到本地文件夹中
insert overwrite local directory '/home/yh/data' select weekday ,count(1) count from u_data_new group by weekday order by count desc;
运行完打开上面输入的文件夹路径,发现有一个000000_0
文件,cat 000000_0查看与 2.5 节控制台输出结果相同,
注意到文件的分隔符没有显示出来,hive保存文件默认分隔符为
^A
。为了在python或者其他软件中方便实用,可以设置分隔符为
\t
,使用命令insert overwrite local directory '/home/yh/data/terminated_fields' row format delimited fields terminated by '\t' select weekday ,count(1) count from u_data_new group by weekday order by count desc;
注意换一个保存路径。使用 tab 作为分隔符
3.2画图
使用python读取并画图
import matplotlib.pyplot as plt
import numpy as np
path = r'C:\Users\yyy\Desktop\share_folder'
file = path + '\\000000_0'
a = np.loadtxt(file)
plt.bar(a[:,0], a[:,1], color='lightgreen')
plt.show()
画图结果