很多数据开发者使用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,例如存留场景),并将处理后的数据写入目标结构表当中供后续处理使用。

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

如何在MaxCompute中利用bitmap进行数据处理?相关推荐

  1. 在MaxCompute中利用bitmap进行数据处理

    很多数据开发者使用bitmap技术对用户数据进行编码和压缩,然后利用bitmap的与/或/非的极速处理速度,实现类似用户画像标签的人群筛选.运营分析的7日活跃等分析. 本文给出了一个使用MaxComp ...

  2. php 输出图片给js,如何在php中利用croppic.js对图片进行剪切并上传

    如何在php中利用croppic.js对图片进行剪切并上传 发布时间:2021-01-30 16:41:02 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关如何在php中利用c ...

  3. android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测

    如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...

  4. php利用ajax文件上传,如何在PHP中利用AjaxForm实现一个文件上传功能

    如何在PHP中利用AjaxForm实现一个文件上传功能 发布时间:2020-12-18 14:52:38 来源:亿速云 阅读:94 作者:Leah 如何在PHP中利用AjaxForm实现一个文件上传功 ...

  5. android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能

    如何在Android中利用Intent实现一个页面跳转功能 发布时间:2021-02-20 17:06:31 来源:亿速云 阅读:113 作者:Leah 本篇文章为大家展示了如何在Android中利用 ...

  6. php中glob怎么用,如何在php中利用glob函数对文件进行遍历

    如何在php中利用glob函数对文件进行遍历 发布时间:2020-12-11 16:02:47 来源:亿速云 阅读:76 作者:Leah 如何在php中利用glob函数对文件进行遍历?相信很多没有经验 ...

  7. php模拟IP请求,如何在php中利用curl对ip进行模拟

    如何在php中利用curl对ip进行模拟 发布时间:2020-12-24 14:25:08 来源:亿速云 阅读:71 作者:Leah 如何在php中利用curl对ip进行模拟?很多新手对此不是很清楚, ...

  8. php通过session保存用户信息,如何在php中利用session与cookie保存用户的登录信息

    如何在php中利用session与cookie保存用户的登录信息 发布时间:2020-12-18 15:49:56 来源:亿速云 阅读:95 作者:Leah 如何在php中利用session与cook ...

  9. 抓取html表单验证码,如何在jquery中利用表单获取短信验证码

    如何在jquery中利用表单获取短信验证码 发布时间:2021-02-18 15:42:54 来源:亿速云 阅读:88 作者:Leah 这期内容当中小编将会给大家带来有关如何在jquery中利用表单获 ...

最新文章

  1. 是你写程序时的样子吗? | 每日趣闻
  2. JWT对称加密非对称加密
  3. ops中set_sysclk set_clkdiv set_pll详解
  4. zip:命令行下zip压缩/解压缩
  5. 从条纹边框的实现谈盒子模型
  6. java jvm 加载_Jvm是如何加载Java类的?
  7. html5 按钮效果,7款外观迷人的HTML5/CSS3 3D按钮特效
  8. [译]const T vs. T const ——Dan Saks 【翻译】
  9. 云计算面试题及答案,云计算工程师面试题集锦
  10. 深入Flutter(四) Infinite scrolling -- 无限滚动
  11. 大数据与云计算——牛客网大数据面试问题总结
  12. 阿里云 mysql 修改root密码修改_设置及修改MySQL root用户密码 - MySQL中文参考手册...
  13. 【AirPlay2开发】协议整合
  14. RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.
  15. 【基于人脸特征的心率检测研究】非接触式光电容积图和红外人脸视频瞬时心率估计
  16. 巨噬细胞膜包裹PLGA纳米粒HCPT-MCNP/MCF-7细胞膜包覆PLGA纳米球共载姜黄素和二氢卟吩e6的研究
  17. 什么是云效 Projex,云效Projex企业级高效研发项目管理平台
  18. 全国省市区Json文件 ,做省市区联动很轻松
  19. 实现一个英文词典的功能
  20. 高通 UEFI:ABL(一)

热门文章

  1. numpy 拼接_数据分析-numpy的拼接与交换
  2. shell 做加法运算_使用shell脚本实现加法乘法运算
  3. websocket 压力测试_打造最强移动测试平台
  4. 这是2019年适合Java程序员读的10本书
  5. rocket mq 监听端口_浅谈业务流程中的mq使用方式
  6. ubuntu18.04升级python_Ubuntu18.04一次性升级Python所有库的方法步骤
  7. 当你抛弃windows使用linux,当我们厌倦了Windows系统还能考虑什么样的桌面操作系统?...
  8. 小黑框如何连接mysql_珍藏版(cmd小黑框)数据库命令及操作
  9. 简单的php,php简单语句
  10. java 远程调试spark_spark开启远程调试