转载:https://blog.csdn.net/bbbeoy/article/details/80772023
本实例通过python脚本对电影数据进行清洗,帮助读者了解hive调用python脚本的整个流程。
操作步骤:
1、创建基表
CREATE TABLE u_data (
userid INT, //用户ID
movieid INT, //电影ID
rating INT, //电影评分
unixtime STRING)。 //时间戳
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2、加载数据
(1)下载数据源到/home/hadoop/data/目录:
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
- 1
(2)解压:
unzip ml-100k.zip
- 1
(3)加载数据:
-
hive> LOAD DATA LOCAL INPATH '/home/hadoop/data/u.data'
-
hive> OVERWRITE INTO TABLE u_data;
- 1
- 2
3、查询数据
首先看一下加载的数据内容,执行:
hive> select * from u_data limit 1;
- 1
结果如下:
统计数据条数,执行:
hive> SELECT COUNT(*) FROM u_data;
- 1
结果如下:
我们可以看到,一共有10万条数据被加载到u_data表中。
4、建立python脚本
此脚本主要清洗数据集中的时间戳,将时间戳转化为字符串日期时间,提取日期时间中的星期值。
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()#转化unixtime时间戳为日期时间,获取对应的星期值
print ('\t'.join([userid, movieid, rating, str(weekday)]))#输出清洗后的数据
保存为weekday_mapper.py,保存路径为:/home/hadoop/data。
5、 创建子表
create table u_data_new(
userid int,
movieid int,
rating int,
weekday int
)
row format delimited
fields terminated by '\t';
6、 添加python脚本:
hive> add FILE /home/hadoop/data/weekday_mapper.py;//绝对路径
- 1
结果如下:
7、 插入数据
将原数据表u_data中经过python脚本清洗后的数据,加载到子表u_data_new中
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;
8、查询数据
查询新表u_data_new数据,并与基表u_data数据对比,执行:
-
hive> select * from db_hive_test.u_data_new limit 1;
-
hive> select * from db_hive_test.u_data_new limit 1;
结果如下:
我们发现,新表时间字段经过python脚本清洗后,转化为星期值
9、统计一周内每天电影观影人次(假设每次观影后必须评分)
select weekday,count(*)
from u_data_new
group by weekday;
结果如下:
总结:
通过以上的例子,我们可以整体了解hive调用python脚本的过程,读者可根据业务需求改进python脚本内容,满足不同的业务场景。