hive学习09天-Hive结合python对电影浏览量以及评分数据分析

本博客参照github上的案例进行学习记录

github地址:https://github.com/ljcan/Hive_Project

#下载数据集
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip unzip ml-100k.zip
查看数据集

[dip@dip007 ml-100k]$ head u.data

196 242 3 881250949

186 302 3 891717742

22 377 1 878887116

244 51 2 880606923

166 346 1 886397596

298 474 4 884182806

115 265 2 881171488

253 465 5 891628467

305 451 3 886324817

6 86 3 883603013

每一列分别代表 : 用户id,电影id,评分,时间

需求分析:

根据用户观看的日期的时间分析在一周中哪一天观看电影的用户最多,也就是电影浏览量峰值。
统计分析电影评分排行榜TOP10(后续可以对用户进行电影推荐)

思路1:

对数据集通过MR进行预处理(最后一列进行格式转换),然后导入hive中进行数据分析

思路2:

直接导入数据到hive中,通过hive调用python函数生成临时表,然后再进行分析

思路一:
MR处理数据:

[dip@dip007 ml-100k]$ cat map.py

import datetime

import sys

for line in sys.stdin:

arr=line.strip().split("\t")

tmp=datetime.datetime.fromtimestamp(float(arr[3])).isoweekday()

print "\t".join([arr[0],arr[1],arr[2],str(tmp)])

[dip@dip007 ml-100k]$ cat run.sh

input="/home/dip/lzm/u.data"

output="/home/dip/lzm/out"

hadoop jar \

/opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.15.1.jar \

-input $input \

-output $output \

-mapper "python map.py" \

-reducer "cat" \

-file "./map.py"

执行 bash run.sh

导入hive:

create table movie(

user_id string,

movie_id string,

score int,

week int

)row format delimited fields terminated by '\t';

load data inpath '/home/dip/lzm/out' into table movie

数据分析1:
根据用户观看的日期的时间分析在一周中哪一天观看电影的用户最多,也就是电影浏览量峰值。
select week ,count(*) as cnt from movie group by week order by cnt desc;
数据分析2:
统计分析电影评分排行榜TOP10(后续可以对用户进行电影推荐)
select movie_id,score from movie order by score desc limit 10;

思路二:

直接将原始数据导入表中,然后写一个python脚本,hive中调用python脚本,写入临时表

思路二:

map.py 如下

import datetime

import sys

for line in sys.stdin:

  arr=line.strip().split("\t")

  tmp=datetime.datetime.fromtimestamp(float(arr[3])).isoweekday()

  print "\t".join([arr[0],arr[1],arr[2],str(tmp)])

创建表:

create table movie(

user_id string,

movie_id string,

score int,

week int

)row format delimited fields terminated by '\t';

load data local inpath '/home/dip/lzm/ml-100k/u.data' into table movie

创建临时表 :

create table movie_tmp(

user_id string,

movie_id string,

score int,

week int

)row format delimited fields terminated by '\t';

数据格式转换

add FILE /home/dip/lzm/ml-100k/map.py;

insert into table movie_tmp

select

transform (user_id,movie_id,score,week)

using "python map.py"

as (user_id,movie_id,score,week)

from movie;

数据分析1:
根据用户观看的日期的时间分析在一周中哪一天观看电影的用户最多,也就是电影浏览量峰值。
select week ,count(*) as cnt from movie_tmp group by week order by cnt desc;
数据分析2:
统计分析电影评分排行榜TOP10(后续可以对用户进行电影推荐)
select movie_id,score from movie_tmp order by score desc limit 10;

思考:

第一种方式适合数据还没有加载到hive中,直接处理,然后再进入hive库中

第二种方式适合数据已经加载到hive中,需要进行分析