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
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
注意:python脚本需要传入到集群内,调用时写上python脚本的路径,可以是集群的路径,也可以是hdfs的路径
|