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;
直接上代码:
#!/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)
简单得学习了下如何用python开发hive的udf,其实这样的速度是很快的,比java快多了,java还要打包,还要把jar包传到线上服务器,的确很麻烦
所以我觉得还是像python这样的脚本语言比较好呀!