很多数据开发者使用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. 如何简单地利用Bitmap为中介储存图片到数据库中

    这是我的第一篇博文,请大家多多指教!     大概一个月之前,在跟朋友合作开发一个APP的过程中,我们发现到一个问题:图片的存储.因为数据库没有图片这种数据类型,当用户上传的图片需要存储的时候,我们无 ...

  3. ML之FE:利用【数据分析+数据处理】算法对国内某平台上海2020年6月份房价数据集【12+1】进行特征工程处理(史上最完整,建议收藏)

    ML之FE:利用[数据分析+数据处理]算法对国内某平台上海2020年6月份房价数据集[12+1]进行特征工程处理(史上最完整,建议收藏) 目录 利用[数据分析+数据处理]算法对链家房价数据集[12+1 ...

  4. python短期预测图_Python中利用长短期记忆模型LSTM进行时间序列预测分析

    原文链接:http://tecdat.cn/?p=6663 此示例中,神经网络用于使用2011年4月至2013年2月期间的数据预测都柏林市议会公民办公室的能源消耗. 每日数据是通过总计每天提供的15分 ...

  5. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

  6. C#中的bitmap类和图像像素值获取方法

     private void button1_Click_1(object sender, EventArgs e)         {             // 画直线 //Bitmap bitM ...

  7. Android下利用Bitmap切割图片

    在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...

  8. 在OpenGL中利用shader进行实时瘦脸大眼等脸型微调

    在OpenGL中利用shader进行实时瘦脸大眼等脸型微调 在现在这个靠脸吃饭的时代,如果你没有一张瓜子脸一双大眼睛,那还怎么去吃饭呢,而现在一些直播视频App相机应用基本都会有瘦脸大眼效果.本文是在 ...

  9. android获取区域内像素坐标,Android利用BitMap获得图片像素数据的方法

    本文实例讲述了Android利用BitMap获得图片像素数据的方法.分享给大家供大家参考,具体如下: 网上看到的参考是: int[] pixels = new int[bit.getWidth()*b ...

最新文章

  1. 数据备份 另一服务器_狡兔三窟-数据备份
  2. python时间戳转换并pandas批量转换时间戳
  3. mobilenet cpu 加速_AI降成本利器!阿里云弹性加速计算实例来了,最高节省50%推理成本...
  4. TortoiseSVN客户端重新设置用户名和密码[转]
  5. CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光
  6. 向DataGridView中添加新的一行数据,可以添加到最后一行或作为第一行
  7. Unix——optarg与getopt的用法
  8. 城市不透水面空间分析——以宁波为例
  9. 在Octane中提升渲染速度的技巧(第1部分)
  10. 校招大学生简历制作模板(ps:程序员简历)
  11. 硬改TP-WR886N v5 路由器刷入源码编译的openWRT/LEDE系统
  12. BZOJ 3717: [PA2014]Pakowanie 状压dp
  13. 基于mysql+php的英语四六级过级成绩管理
  14. Cannot save setting
  15. mysql 获取一条数据_MySQL数据库中随机获取一条或多条记录
  16. 鼠标手是否算工伤 专家:法定职业病才能获赔
  17. “我祝你不幸并痛苦”——约翰·罗伯茨毕业致辞
  18. Qlikview配置ODBC连接SQL SERVER/ORACLE
  19. org.eclipse.equinox.p2.core.ProvisonException
  20. 关于闭包(closure)

热门文章

  1. oracle 查看监听命令_linux下使用Oracle常用命令
  2. 成长为一名Java架构师需要掌握的技术有哪些呢?
  3. robotframework安装_python3.9.0 + robotframework + selenium3 实例体验
  4. python实例化对象有new吗_PHP new:实例化对象
  5. rocket mq 监听端口_浅谈业务流程中的mq使用方式
  6. 厦门大学2016年c语言程序设计,厦门大学c语言程序设计2016模拟题讲评及课程复习.pptx...
  7. 32岁了学python来的及吗_现在27岁学python来得及吗?
  8. 执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!
  9. php中文本设置随机颜色,php 产生随机整数,随机字符串,随机颜色等类用法
  10. python读取word指定内容_python读取word 中指定位置的表格及表格数据