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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 设置Eclipse缩进为4个空格,增强代码规范
- 面试大杂烩
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)