Hive调用python脚本

14 篇文章 0 订阅
3 篇文章 0 订阅

Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能,本实例通过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
    STORED AS TEXTFILE;

2、加载数据

(1)下载数据源到/home/hadoop/data/目录:

wget http://files.grouplens.org/datasets/movielens/ml-100k.zip

(2)解压:

unzip ml-100k.zip

(3)加载数据:

hive> LOAD DATA LOCAL INPATH '/home/hadoop/workspace/dhp/ml-100k/u.data' 
hive> OVERWRITE INTO TABLE u_data;

在这里插入图片描述
3、查询数据
首先看一下加载的数据内容,执行:

 hive> select * from u_data limit 5;

结果如下:
在这里插入图片描述
统计数据条数,执行:

hive> SELECT COUNT(*) FROM u_data;

结果如下:
在这里插入图片描述
我们可以看到,一共有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)])//输出清洗后的数据

保存为mapper_weekday.py,保存路径为:/home/hadoop/workspace/dhp。

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/workspace/dhp/mapper_weekday.py;//绝对路径

在这里插入图片描述
7、 插入数据

将原数据表u_data中经过python脚本清洗后的数据,加载到子表u_data_new中
/home/hadoop/workspace/dhp目录下新建mapper_weekday.sql文件,添加如下内容:

 INSERT OVERWRITE TABLE u_data_new
    SELECT
      TRANSFORM (userid, movieid, rating, unixtime)    //输入值(基表)
      USING 'python /home/hadoop/workspace/dhp/mapper_weekday.py'                   //使用脚本清洗
      AS (userid, movieid, rating, weekday)             //输出值(子表)
    FROM u_data;   //基表

保存后执行:

bin/hive -f /home/hadoop/workspace/dhp/mapper_weekday.sql

在这里插入图片描述
8、查询数据
查询新表u_data_new数据,并与基表u_data数据对比,执行:

hive> select * from db_hive_test.u_data limit 2;
hive> select * from db_hive_test.u_data_new limit 2;

结果如下:

在这里插入图片描述

我们发现,新表时间字段经过python脚本清洗后,转化为星期值

9、统计一周内每天电影观影人次(假设每次观影后必须评分)

SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;

结果如下:
在这里插入图片描述

总结:
通过以上的例子,我们可以整体了解hive调用python脚本的过程,读者可根据业务需求改进python脚本内容,满足不同的业务场景。

问题解决:

FAILED: Execution Error, return code 20001 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. An error occurred while reading or writing to your custom script. It may have crashed with an error

解决:笔者在mapper_weekday.sql中python脚本未写绝对路径,导致报错;修改如下即可:

python /home/hadoop/workspace/dhp/mapper_weekday.py
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值