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这样的脚本语言比较好呀!

更多相关文章

  1. 怎样写贪吃蛇小游戏?用100行python代码轻松解决!
  2. 建模分析之机器学习算法(附python&R代码)
  3. 读取python中的unicode文件,该文件以与python源代码相同的方式声
  4. 自动完成在VS代码和Python中的自动化对象
  5. 在生产中是否应该减少服务器代码?
  6. 支持c和python之间的跨语言(c)标记的代码编辑器
  7. 【小白自学笔记】【机器学习实战】【Python代码逐行理解】CH02
  8. 三个猜数字游戏代码(Python)
  9. 在混合的Bash-Python代码片段中,变量的双引号和单引号

随机推荐

  1. Android(安卓)Studio自动生成带系统签名
  2. Android(安卓)Camera 使用小结
  3. Android(安卓)事件传递机制
  4. Android插件技术——(一)动态加载jar
  5. android音频编辑之音频合成
  6. 使用TraceView进行方法跟踪
  7. android 自定义RadioButton样式
  8. Android基础开源应用项目
  9. Android(安卓)studio搭建helloworld案例
  10. Android(安卓)从源码分析View层次之Actio