maxCompute的UDAF demo,实现累加功能
需求:将表中数据按照name聚合,并且count进行累加
name | count |
---|---|
Jan | 1 |
Jan | 2 |
Feb | 3 |
Feb | 1 |
Mar | 1 |
Mar | 5 |
预期结果:
name | count |
---|---|
Jan | 3 |
Feb | 7 |
Mar | 13 |
使用idea的maxCompute studio新增UDAF
然后自动生成未实现的方法,我的字段name是string,count是bigint
所以@Resolve("string,bigint->bigint")
新增一个class用来存储字段
private String name; private Long count; @Override public void write(DataOutput out) throws IOException { out.writeUTF(name); out.writeLong(count); } @Override public void readFields(DataInput in) throws IOException { name = in.readUTF(); count = in.readLong(); } }
这样newBuffer就可以这样写了
public Writable newBuffer() { return new MyBuffer(); }
还需要一个Map来存储key(name)和value(count),一个long类型的参数存储累加的值
Long old_count = 0L;//存储累加值 private LongWritable ret = new LongWritable();//存储输出值
完整代码参考:
public class UDAFTest extends Aggregator { private static class MyBuffer implements Writable { private String name; private Long count; @Override public void write(DataOutput out) throws IOException { out.writeUTF(name); out.writeLong(count); } @Override public void readFields(DataInput in) throws IOException { name = in.readUTF(); count = in.readLong(); } } @Override public Writable newBuffer() { return new MyBuffer(); } Map<String,Long> map = new LinkedHashMap<>(); Long old_count = 0L; @Override public void iterate(Writable buffer, Writable[] args) throws UDFException { String arg = String.valueOf(args[0]); Long cnt = Long.parseLong(String.valueOf(args[1])); MyBuffer buf = (MyBuffer) buffer; if (arg != null) { if(map.containsKey(arg)){ Long newcnt = map.get(arg); old_count = cnt+newcnt; map.put(arg,old_count); }else { map.put(arg,old_count+cnt); } } buf.name = arg; buf.count = map.get(arg); } private LongWritable ret = new LongWritable(); @Override public Writable terminate(Writable arg0) throws UDFException { MyBuffer buffer = (MyBuffer) arg0; ret.set(buffer.count); return ret; } @Override public void merge(Writable buffer, Writable partial) throws UDFException { MyBuffer buf = (MyBuffer) buffer; MyBuffer p = (MyBuffer) partial; buf.name = p.name; buf.count = p.count; } }
然后通过maxCompute studio发布下
发布名为test20191119,这样就可以在Dataworks中调用了。
其中原表数据:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
携号转网:你,转网了吗?
“我觉得要不是迫于压力,这几家运营商压根儿就不想做携号转网,这门槛太也多了。”一位尝试携号转网的用户摇头叹气道。 他告诉懂懂笔记,自己在查询转网资格时,才发现名下号码居然绑定了如此多的业务和套餐。如今,这些“套餐”成了转网的拦路虎,如果他想完成转网,可能要坚持活过2099年。 的确,近日和不少手机用户交流时,可以看到他们的转网回复短信中,都存在着各种各样的难题,有些服务动辄“2025、2030”甚至更久。 那么,这转网到底是让转还是不让转呢? 免费赠送服务的时机太微妙 “查询转网资格之前,我也看到不少新闻提到有太多门槛。” 家住广州的钟先生一直打算更换运营商。由于过去更换运营商无法更换手机号码,加上他的手机号码是自家店铺唯一的联系方式,因此就作罢了。但是一周前听说三大运营商可以携号转网,他顿感十分兴奋。在查看网上相关流程之后,他开始发送短信查询资格,“当时觉得蛮简单的,就是发个短信而已。” 然而,当看到运营商发回的短信时,钟先生顿时傻了眼。他告诉懂懂笔记,回复信息表示他的号码暂时无携号转网的资格,并且罗列了无法携号转网的六大原因,“除了网上说的服务套餐、宽带未到期,家庭短号、集团短号未...
- 下一篇
移动开发困局下,我们如何往音视频方向发力
一、背景 移动互联网发展不知不觉已经十多年了,移动开发的光环和溢价开始慢慢消失,并且正在向AI、区块链等新的领域转移。移动开发的新鲜血液也已经变少,最明显的是国内应届生都纷纷涌向了AI方向。 那么已经入行Android的技术员我们如何寻求和跟上社会时代变迁的脚步呢? 近年来,有赖于移动互联网的普及和智能终端设备的广泛应用,短视频、直播、在线教学1V1等各类形式的实时音视频通信模式风靡大众,成为人们日常沟通的新模式。在技术端,应用平台也在市场需求的推动下主动走近音视频技术,将这门在过往主要面向专业性、大场景的高深技术推出实验室,探寻在大众市场生根结果的模式和可能,使易用稳定的音视频功能真正“飞入寻常百家姓”。 在中国已经形成南抖音北快手的格局,纽约时报援引研究机构Sensor Tower的数据称,在过去的12个月中,海外版抖音TikTok的下载量超过7.5亿次,而Facebook的下载次数为7.15亿,Instagram为4.5亿,YouTube为3亿,Snapchat为2.75亿。 因此在音视频热潮下,我们移动开发者学习音视频技术就显得尤为重要和关键了。 二、音视频开发 音视频开发需要...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果