Chinaunix首页 | 论坛 | 博客
  • 博客访问: 627561
  • 博文数量: 155
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1237
  • 用 户 组: 普通用户
  • 注册时间: 2016-03-11 14:13
个人简介

狂甩酷拽吊炸天

文章分类

全部博文(155)

文章存档

2020年(16)

2019年(37)

2018年(17)

2017年(35)

2016年(50)

分类: LINUX

2019-12-06 15:27:49

Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能,本实例通过python脚本对电影数据进行清洗,帮助读者了解hive调用python脚本的整个流程。一般开发hive的UDF都是用java,hive调用python脚本类似于python版本的UDF。话不多说,直接上步骤

1、创建基表

点击(此处)折叠或打开

  1. CREATE TABLE u_data (
  2.   userid INT, -- 用户ID
  3.   movieid INT, -- 电影ID
  4.   rating INT, -- 电影评分
  5.   unixtime STRING --时间戳
  6. )
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY '\t'
  9. LINES TERMINATED BY '\n'
  10. STORED AS TEXTFILE;
2、加载数据
   下载数据:wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
    解压:unzip ml-100k.zip
    加载数据:LOAD DATA LOCAL IN PATH '/home/xxxx/ml-100k/u.data' OVERWRITE INTO TABLE u_data;


3、查询数据是否load进表
     select * from u_data limit 1
0;
4、建立python脚本
      此脚本主要清洗数据集中的时间戳,将时间戳转化为字符串日期时间,提取日期时间中的星期值。脚本命名为transform.py

点击(此处)折叠或打开

  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-

  3. """
  4. @Author: xxxxx
  5. @Date: 2019/12/06 15:19
  6. @FileName:transform.py
  7. """

  8. import sys
  9. import datetime

  10. reload(sys)
  11. sys.setdefaultencoding("utf-8")

  12. for line in sys.stdin:
  13.     line = line.strip()
  14.     userid, movieid, rating, unixtime = line.split('\t') # 分割一条数据
  15.     weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() # 转化unixtime时间戳为日期时间,获取对应的星期值
  16.     print "\t".join([userid, movieid, rating, str(weekday)]) # 输出清洗后的数据

5、 创建子表,用于存储清晰过后的数据

点击(此处)折叠或打开

  1. CREATE TABLE u_data_new (
  2.   userid INT,
  3.   movieid INT,
  4.   rating INT,
  5.   weekday INT)
  6. ROW FORMAT DELIMITED
  7. FIELDS TERMINATED BY '\t'

6、 添加python脚本:
  hive (recommend)>   add file /home/xxxx/transform.py;


7、查看是否添加成功
    hive (recommend)> list files;
    /home/xxxx/transform.py

8、 插入数据
     将原数据表u_data中经过python脚本清洗后的数据,加载到子表u_data_new中

点击(此处)折叠或打开

  1. INSERT OVERWRITE TABLE u_data_new
  2. SELECT
  3.   TRANSFORM (userid, movieid, rating, unixtime) --输入值(基表)
  4.   USING 'python transform.py' --使用脚本清洗
  5.   AS (userid, movieid, rating, weekday) --输出值(子表)
  6. FROM u_data

9、查询数据
查询新表u_data_new数据,并与基表u_data数据对比,执行:
select * from u_data_new limit 10;
select * from u_data limit 10;

阅读(4187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~