本实例通过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)])//输出清洗后的数据
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
保存为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';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
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; //基表
- 1
- 2
- 3
- 4
- 5
- 6
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;
- 1
- 2
结果如下:
我们发现,新表时间字段经过python脚本清洗后,转化为星期值
9、统计一周内每天电影观影人次(假设每次观影后必须评分)
SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;
- 1
- 2
- 3
- 4
结果如下:
总结:
通过以上的例子,我们可以整体了解hive调用python脚本的过程,读者可根据业务需求改进python脚本内容,满足不同的业务场景。