学习用pyhon写hive udf

1. 最近有个需求是找出一批一年内每个月连续交易额超过10000元的商户,经过hive的一些操作最后数据如下(已省略不需要的字段):

    m, p, consume, cnt m和p唯一标记商户,consume是12个月的交易额(逗号分割),cnt不用管

2. 分析得知用hive原生的一些函数不好处理,那么想到了udf,本来想用java写的,但是java有太多依赖包了,刚好在学python,就想到用python写hive的udf,用的其实就是streaming

3. 先上代码:

#!/usr/bin/env python
# vim: set fileencoding=utf-8

import sys


for line in sys.stdin:
	detail = line.strip().split('\t')
	if (len(detail) < 4):
		continue
	mid = detail[0]
	pid = detail[1]
	trans_at = detail[2]
	total_cnt = detail[3]

	trans_at_month = trans_at.split(',')
	if (len(trans_at_month) != 12):
		continue
	flag = True
	for money in trans_at_month:
		if (float(money) < 10000.0):
			flag = False
	if (flag):
		print '%s\t%s\t%s\t%s' % (mid, pid, trans_at, total_cnt)

通过代码可以看出我们是将每条记录进行过滤的,去除不符合条件的记录,把符合我们条件的输出

4. 调用方式:

add file /home/xxx/udf/python/xxx.py;

select transform(m, p, consume, cnt) using 'python xxx.py' as (mid, pid, trans_at, total_cnt) from xxx_table;

5. 接下去看下怎么做简单的聚合(列转行)

直接上代码:

#!/usr/bin/env python
# vim: set fileencoding=utf-8

import sys

total = 0
for line in sys.stdin:
    total += int(line.strip())

print '%s' % (total)

很简单,不说了

6. 说下怎么用单行输出多行(行转列),也就是类似于explode() udf 和lateral view的语法,其实比较简单,比如刚刚我们有个字段是这样的100.1,200.2,2.5...一共12个,那么我们如果想输出每个月详细的数据可以在for循环的时候进行输出,贴上部分代码:

for money in trans_at_month:
	print '%s\t%s\t%s\t%s' % (mid, pid, trans_at, total_cnt)

7. 还可以和cluster by  distribute by sort by联合使用,这样可以告诉hive  key相同的数据进入同一个reduce进行处理


简单得学习了下如何用python开发hive的udf,其实这样的速度是很快的,比java快多了,java还要打包,还要把jar包传到线上服务器,的确很麻烦

所以我觉得还是像python这样的脚本语言比较好呀!

你可能感兴趣的:(python,hadoop,hive,mapreduce)