如何在MaxCompute中利用bitmap进行数据处理?

很多数据开发者使用bitmap技术对用户数据进行编码和压缩,然后利用bitmap的与/或/非的极速处理速度,实现类似用户画像标签的人群筛选、运营分析的7日活跃等分析。
本文给出了一个使用MaxCompute MapReduce开发一个对不同日期活跃用户ID进行bitmap编码和计算的样例。供感兴趣的用户进一步了解、分析,并应用在自己的场景下。


import com.aliyun.odps.OdpsException;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.TableInfo;
import com.aliyun.odps.mapred.JobClient;
import com.aliyun.odps.mapred.MapperBase;
import com.aliyun.odps.mapred.ReducerBase;
import com.aliyun.odps.mapred.conf.JobConf;
import com.aliyun.odps.mapred.utils.InputUtils;
import com.aliyun.odps.mapred.utils.OutputUtils;
import com.aliyun.odps.mapred.utils.SchemaUtils;
import org.roaringbitmap.RoaringBitmap;
import org.roaringbitmap.buffer.ImmutableRoaringBitmap;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Base64;
import java.util.Iterator;public class bitmapDemo2
{public static class BitMapper extends MapperBase {Record key;Record value;@Overridepublic void setup(TaskContext context) throws IOException {key = context.createMapOutputKeyRecord();value = context.createMapOutputValueRecord();}@Overridepublic void map(long recordNum, Record record, TaskContext context)throws IOException{RoaringBitmap mrb=new RoaringBitmap();long AID=0;{{{{AID=record.getBigint("id");mrb.add((int) AID);//获取keykey.set(new Object[] {record.getString("active_date")});}}}}ByteBuffer outbb = ByteBuffer.allocate(mrb.serializedSizeInBytes());mrb.serialize(new DataOutputStream(new OutputStream(){ByteBuffer mBB;OutputStream init(ByteBuffer mbb) {mBB=mbb; return this;}public void close() {}public void flush() {}public void write(int b) {mBB.put((byte) b);}public void write(byte[] b) {mBB.put(b);}public void write(byte[] b, int off, int l) {mBB.put(b,off,l);}}.init(outbb)));String serializedstring = Base64.getEncoder().encodeToString(outbb.array());value.set(new Object[] {serializedstring});context.write(key, value);}}public static class BitReducer extends ReducerBase {private Record result = null;public void setup(TaskContext context) throws IOException {result = context.createOutputRecord();}public void reduce(Record key, Iterator<Record> values, TaskContext context) throws IOException {long fcount = 0;RoaringBitmap rbm=new RoaringBitmap();while (values.hasNext()){Record val = values.next();ByteBuffer newbb = ByteBuffer.wrap(Base64.getDecoder().decode((String)val.get(0)));ImmutableRoaringBitmap irb = new ImmutableRoaringBitmap(newbb);RoaringBitmap p= new RoaringBitmap(irb);rbm.or(p);}ByteBuffer outbb = ByteBuffer.allocate(rbm.serializedSizeInBytes());rbm.serialize(new DataOutputStream(new OutputStream(){ByteBuffer mBB;OutputStream init(ByteBuffer mbb) {mBB=mbb; return this;}public void close() {}public void flush() {}public void write(int b) {mBB.put((byte) b);}public void write(byte[] b) {mBB.put(b);}public void write(byte[] b, int off, int l) {mBB.put(b,off,l);}}.init(outbb)));String serializedstring = Base64.getEncoder().encodeToString(outbb.array());result.set(0, key.get(0));result.set(1, serializedstring);context.write(result);}}public static void main( String[] args ) throws OdpsException{System.out.println("begin.........");JobConf job = new JobConf();job.setMapperClass(BitMapper.class);job.setReducerClass(BitReducer.class);job.setMapOutputKeySchema(SchemaUtils.fromString("active_date:string"));job.setMapOutputValueSchema(SchemaUtils.fromString("id:string"));InputUtils.addTable(TableInfo.builder().tableName("bitmap_source").cols(new String[] {"id","active_date"}).build(), job);
//        +------------+-------------+
//        | id         | active_date |
//        +------------+-------------+
//        | 1          | 20190729    |
//        | 2          | 20190729    |
//        | 3          | 20190730    |
//        | 4          | 20190801    |
//        | 5          | 20190801    |
//        +------------+-------------+OutputUtils.addTable(TableInfo.builder().tableName("bitmap_target").build(), job);
//        +-------------+------------+
//        | active_date | bit_map    |
//        +-------------+------------+
//        20190729,OjAAAAEAAAAAAAEAEAAAAAEAAgA=3D
//        20190730,OjAAAAEAAAAAAAAAEAAAAAMA
//        20190801,OjAAAAEAAAAAAAEAEAAAAAQABQA=3DJobClient.runJob(job);}
}

对Java应用打包后,上传到MaxCompute项目中,即可在MaxCompute中调用该MR作业,对输入表的数据按日期作为key进行用户id的编码,同时按照相同日期对bitmap后的用户id取OR操作(根据需要可以取AND,例如存留场景),并将处理后的数据写入目标结构表当中供后续处理使用。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git永久保存账号密码

git永久保存账号密码 安装好git后 直接在git bash 中执行命令&#xff1a; git config --global credential.helper store然后输入账号密码 git config --global user.name "用户名" git config --global user.email "邮箱" git config --global user.p…

程序员的年龄越大编程能力越弱???原来我们都理解错了

大多数人都说程序员是低调多金的代表&#xff0c;但是一旦年龄突破30岁&#xff0c;就容易陷入各种被嫌弃中&#xff0c;无法逃脱三十五岁定律。这让许多已到中年的程序员感觉忽然头上悬了几把剑。一位74岁的数据科学家Gene DAngelo则恰恰相反。他曾在社区提出话题&#xff1a;…

唱吧基于 MaxCompute 弥补自建体系的不足

本文作者&#xff1a;马星显 唱吧大数据负责人 使用 MaxCompute之前&#xff0c;唱吧使用自建体系来存储处理各端收集来的日志数据&#xff0c;包括请求访问记录、埋点数据、服务器业务数据等。初期这套基于开源组件的体系有力支撑了数据统计、业务报表、风控等业务需求。但随…

js、vue文本点击复制内容

js、vue文本点击复制内容 第一种办法 <div class"copy-btn2" click"copyOrderId2(复制成功了2222222)"><i class"el-icon-document-copy"></i>复制链接</div>copyOrderId2(orderId) {var input document.createElemen…

1.倒排索引 2.逻辑斯提回归算法

1.倒排索引 https://help.aliyun.com/zh/open-search/retrieval-engine-edition/introduction-to-inverted-indexes 倒排索引&#xff08;Inverted Index&#xff09;是一种数据结构&#xff0c;用于快速查找包含某个特定词或词语的文档。它主要用于全文搜索引擎等应用&#…

塑云科技基于 KafKa+OTS+MaxCompute 完成物联网系统技术重构

塑云科技&#xff1a;性能突破&#xff0c;基于KafKaOTSMaxCompute 完成了一次物联网系统技术重构 背景&#xff1a;创业团队&#xff0c;专注于氢能燃料电池生态链的运营支撑&#xff0c;当前主要的业务组成为新能源车整车实时运营监控分析&#xff0c;加氢站实时运营监控分析…

什么是Docker?看这一篇文章就够了

作者 | 码农的荒岛求生来源 | 程序员小灰&#xff08;ID: chengxuyuanxiaohui&#xff09;程序员&#xff0c;应该怎样理解docker&#xff1f;容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP&#xff0c;我们姑且称为明日头条&#xff0c;程序员自己从头到尾搭建…

基于MaxCompute 衣二三帮助客户找到合适自己的衣服

摘要&#xff1a;本文由衣二三CTO程异丁为大家讲解了如何基于MaxCompute构建智能化运营工具。 衣二三作为亚洲最大的共享时装平台&#xff0c;MaxCompute是如何帮助它解决数据提取速度慢、数据口径差异等问题呢&#xff1f;程异丁通过衣二三数据体系架构&#xff0c;从用户运营…

Nexus 3.31.1 maven 私服 搭建篇 linux

文章目录1. Nexus 3 下载2. 解压3. 目录调整4. 重命名5. 创建用户6. 调整家目录7. 指定启动用户8. 环境变量配置9. 刷新环境变量10. 修改工作目录11. 指定jdk12. 修改权限13. nexus启动14. 状态验证15. 浏览器验证16. 登录17. 初始化设置软件版本JDK1.8.0_202Nexus3.31.1Disk s…

Typora简介

Typora简介 一、Typora是什么&#xff1f; ​ Typora 是一款支持实时预览的 Markdown 文本编辑器。它有 OS X、Windows、Linux 三个平台的版本&#xff0c;并且由于仍在测试中&#xff0c;是完全免费的。 ​ Typora 首先是一个 Markdown 文本编辑器&#xff0c;它支持且仅支…

基于MaxCompute InformationSchema进行血缘关系分析

一、需求场景分析 在实际的数据平台运营管理过程中&#xff0c;数据表的规模往往随着更多业务数据的接入以及数据应用的建设而逐渐增长到非常大的规模&#xff0c;数据管理人员往往希望能够利用元数据的分析来更好地掌握不同数据表的血缘关系&#xff0c;从而分析出数据的上下游…

不要再被 Python 洗脑了!!

Python 作为一种解释型技术脚本语言&#xff0c;越来越被认可为程序员新时代的风口语言。 无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的技术大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 而作为Python初学者来讲&#xff0c;最大的问题…

Nexus 3.31.1 maven 私服 仓库配置篇 linux

文章目录1. 新建仓库概述2. 阿里云代理仓库3. 自己的仓库4. 自己的仓库组5. 效果图1. 新建仓库概述 总共新建3各仓库 一个是国内开源仓库&#xff0c;加速下载 一个是自己的仓库&#xff0c;用于存放自己公司的jar 一个是子类型的仓库&#xff0c;用于将上述两个组成一个地址 …

Struct复杂数据类型的UDF编写、兼容HIVE的GenericUDF编写

一、背景介绍&#xff1a; MaxCompute 2.0版本升级后&#xff0c;Java UDF支持的数据类型从原来的BIGINT、STRING、DOUBLE、BOOLEAN扩展了更多基本的数据类型&#xff0c;同时还扩展支持了ARRAY、MAP、STRUCT等复杂类型&#xff0c;以及Writable参数。Java UDF使用复杂数据类型…

如何跨项目工作空间访问MaxCompute资源和函数?

1、背景介绍 同一个主账号下面的两个工作空间&#xff0c;工作空间名称分别为 A工作空间名称:wei_wwww A工作空间子账号&#xff1a;mc_oss B工作空间名称:wei_mc B工作空间子账号&#xff1a;bigdata_wei 现在B工作空间子账号bigdata_wei需要访问A工作空间子账号mc_oss创建的U…

Nexus 3.31.1 maven 私服 仓库和IntelliJ IDEA 2021.2 实战篇 linux

文章目录一、maven配置1. 私服配置2. 替换后的配置二、IntelliJ IDEA2.1. 创建项目2.2. 指定配置2.3. 下载依赖三、nexus3 监控3.1. 查看依赖版本3.2. 版本对比3.3. aliyun 仓库地址一、maven配置 1. 私服配置 在本地的maven 配置settings.xml内容&#xff0c;用下面内容覆盖…

我把这篇文章给女朋友看,她终于明白什么是「数据中台」了

来源 | 智领云科技责编 | Carol封图 | CSDN 下载自视觉中国这几天&#xff0c;女朋友一直忙着为自己挑选情人节礼物&#xff0c;毕竟直男的审美她也觉得不靠谱。就在昨天&#xff0c;她气冲冲地跑过来问我&#xff1a;为什么有些平台总是推荐一些我不喜欢的东西&#xff1f;为什…

发光的二次元克拉克拉 满足年轻用户个性化、碎片化的文娱需求

克拉克拉&#xff08;KilaKila&#xff09;是国内专注二次元、主打年轻用户的娱乐互动内容社区软件。KilaKila 推出互动语音直播、短视频配音、对话小说等功能&#xff0c;满足当下年轻用户个性化、碎片化的文娱需求。随着业务规模增长&#xff0c;海量数据存储与计算的瓶颈也日…

Nexus 3.31.1 maven 私服 服务器配置篇 linux

文章目录一、以服务运行1. 编写配置2. 赋予可执行权限3. 配置自启动4. 启动nexus5. 监控状态6. 停止服务二、配置文件说明2.1. JAVA配置2.2. 自定义配置2.3. 工作/日志 目录修改三、使用nginx代理3.1. HTTP3.2. HTTPS四、其他配置4.1. 配置匿名访问4.2. 更改管理员电子邮件地址…

混合云模式助力斗鱼搭建混搭大数据架构

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 案例背景 2019杭州云栖大会大数据企业级服务专场&#xff0c;由斗鱼大数据高级专家张龙…