栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

HIVE中替换UDF神器-- TRANSFORM()函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HIVE中替换UDF神器-- TRANSFORM()函数

TRANSFORM()

在平时的hive开发中,虽然hive提供了一些比较丰富的内置函数,但是也不能完全的满足生产中的需要,对于一些逻辑,需要自定义UDF实现,但是又不想写UDF,还需要实现,就可以用TRANSFORM()方法

TRANSFORM()方法可以看作是从一个表中读取了一些字段,但是其中的一些字段需要做一些处理,那么就可以使用TRANSFORM函数,通过调用我们写好的处理脚本,处理这段逻辑,比如python脚本等等。

以HIVE官网中的一个例子为例讲解一下TRANSFORM函数的使用

比如需要对一个时间戳转换为是周几,就是输入一个时间戳,返回这个时间戳是周几。

TRANSFORM语法:

select
  transform(column1, column2,...)
  using 'python xxx.py'
  as (column1, column2,...)
from
  tbl

简而言之,就是从一个表中读取字段,用python脚本处理,然后输出新的字段。
那么python脚本怎么使用呢?
python中通过sys.stdin来获取输入的字段,然后通过循环处理每一行数据即可

for line in sys.stdin:
    xxx #处理逻辑
    print 't'.join(column1, column2, ...)

处理起来很简单,借助python得天独厚的优点,可以很方便的处理复杂逻辑
根据HIVE官方提供的案例,看一下
传入字段,调用python脚本,处理,输出结果到hive表中

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()
  # 拼接结果输出
  print 't'.join([userid, movieid, rating, str(weekday)])

调用脚本

INSERT OVERWRITE TABLE u_data_new
SELECt
  -- 从u_data里面拿到的数据
  TRANSFORM (userid, movieid, rating, unixtime)
  -- 调用脚本处理传入参数
  USING 'python weekday_mapper.py'
  -- 输出到u_data_new的参数,将unixtime转变为了weekday
  AS (userid, movieid, rating, weekday)
FROM u_data;

注意:python脚本需要传入到集群内,调用时写上python脚本的路径,可以是集群的路径,也可以是hdfs的路径

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997709.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号