参考官方提供的一个使用python做数据处理案例。
官方案例地址
创建新表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
下载初始数据
下载文件到自己需要放的目录
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
或者
curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip
解压文件
unzip ml-100k.zip
加载数据
LOAD DATA LOCAL INPATH '/opt/cdhmoduels/data/ml-100k/u.data' into table u_data;
这个时候的数据格式是这样的
hive (default)> select * from u_data limit 10;
OK
u_data.userid u_data.movieid u_data.rating u_data.unixtime
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
上面结果中的最后一列的时间戳,我们需要把他变成星期几,大概结果是这样的
hive (default)> select * from u_data_new limit 10;
OK
u_data_new.userid u_data_new.movieid u_data_new.rating u_data_new.weekday
196 242 3 4
186 302 3 6
22 377 1 4
244 51 2 3
166 346 1 7
298 474 4 3
115 265 2 3
253 465 5 5
305 451 3 7
6 86 3 3
怎么把第一种结果变成第二种呢,这里就用python做一个数据处理了。
创建python
新建python脚本
新建py文件,vi 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)])
------------------------------
其中函数大概含义是这样的
1、.strip()移除左右空格,默认就是空格
2、.split('\t')通过这个方法来对于字符串进行切片
3、.isoweekday()通过这个方法最终返回一个比如:如果是周一,那么返回1,以此类推,这样的类型
现在py函数写好了,那怎么用呢。
添加py脚本文件到hive,命令:
add file /opt/cdhmoduels/data/weekday_mapper.py;
再新建一个表,用来保存数据处理过的数据
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
调用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;
查看结果
select * from u_data_new;
SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;