当前位置: 首页 > news >正文

用户画像系列——HBase 在画像标签过期策略中的应用

一、背景

前面系列文章介绍了用户画像的概念、用户画像的标签加工、用户画像的应用。本篇文章主要介绍一些画像的技术细节,让大家更加详细的了解画像数据存储和处理的逻辑

举个现实中的例子:

例子1:因为疫情原因,上线一个平台(和疫情相关),然后用户关注了疫情这个平台,有一个标签来标识用户是否关注疫情,但是随着政策放开,这个标签显然对公司来说是没有用随着疫情放开之后,而且还浪费存储成本,需要单独弄一个字段来进行标识

例子2:一个账号在购物或者看视频的时候会登录很多个设备,比如说 电商平台网页版、手机版(安卓、ios)或者pad 版本等等,但是可能随着用户换设备(换手机、电脑或者pad),之前的设备信息再进行存储也没有意义,毕竟那个手机或者电脑可能已经不在使用了,至少不挂在这个账号体系下了

通过上面上个例子,能看到有这样一些标签,随着时间的推移,对业务没有价值浪费存储空间,甚至因为没有过期造成误解

二、解决思路

那有没有这样一个方案呢?对这样的标签进行过期处理呢?

比如说:认为某个账号下一个设备半年不更新或者某个标签半年不更新就对这个标签进行删除呢?

 上述流程图介绍了标签的写入流程以及标签过期的处理流程。

标签过期:需要读取所有的画像数据,对每个标签进行判断,如果当前时间—标签的更新时间>标签的TTL时间,需要对该标签进行删除。

即:整个流程支持数据库列级别的TTL,要求能获取到标签更新的时间,也就是列的更新时间

三、具体实现

目前整体采用Hbase +Mysql来实现,Hbase支持更新列的时候设置更新时间,同时支持获取列的读取到列的更新时间,通过Mysql配置标签的TTL信息即可完成整体流程

hbase写入时设置列的时间
@Testpublic void insert() throws IOException {Calendar calendar = Calendar.getInstance();calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) - 1, 0, 0, 0);long preZero = calendar.getTime().getTime();System.out.println(preZero);Connection connection = createConnection();Table table = connection.getTable(TableName.valueOf("tmp_test_info"));ArrayList<Put> puts = new ArrayList<>();Put put4 = new Put("0005".getBytes());put4.addColumn("f1".getBytes(), "name".getBytes(), preZero, Bytes.toBytes("小杰"));put4.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(24));//不设置则用当前时间puts.add(put4);table.put(puts);table.close();connection.close();}
@Test
public void scan() throws IOException {Map<String, Long> cellTTL = new HashMap<>();cellTTL.put("name", 1L);//单位天cellTTL.put("age", 2L);//单位天List<Delete> deleteList = new ArrayList<>();long currentTime = System.currentTimeMillis();Table table = createConnection().getTable(TableName.valueOf("tmp_test_info"));Scan scan = new Scan();scan.withStartRow("0001".getBytes());scan.withStopRow("0008".getBytes());ResultScanner scanner = table.getScanner(scan);for (Result result : scanner) {List<Cell> cells = result.listCells();for (Cell cell : cells) {String rk = Bytes.toString(CellUtil.cloneRow(cell));String family = Bytes.toString(CellUtil.cloneFamily(cell));String column = Bytes.toString(CellUtil.cloneQualifier(cell));long timestamp = cell.getTimestamp();if (column.equals("name")) {String value = Bytes.toString(CellUtil.cloneValue(cell));System.out.println(rk + ":" + family + ":" + column + ":" + value + ":" + timestamp);} else {int value = Bytes.toInt(CellUtil.cloneValue(cell));System.out.println(rk + ":" + family + ":" + column + ":" + value + ":" + timestamp);}if (cellTTL.containsKey(column)) {if (currentTime - timestamp > cellTTL.get(column)*24*60*60*1000) {//判断列标签是否过期Delete delete = new Delete(Bytes.toBytes(rk));delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));deleteList.add(delete);}}}}if (!deleteList.isEmpty() && deleteList.size() > 0) {table.delete(deleteList);}table.close();
}

上面给出了一个简单版本的过期策略处理代码

http://www.lryc.cn/news/63049.html

相关文章:

  • 时下热门话题:ChatGPT能否取代人类?
  • 每日刷题记录(十七)
  • 开放原子训练营(第三季)RT-Thread Nano学习营一探究竟
  • 数据库系统概论(二)关系数据库,SQL概述和数据库安全性
  • 【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类
  • Java核心书籍1
  • crontab详细用法 定时任务
  • 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局
  • 开心档之MySQL 创建数据类型
  • 【C++ Primer(第5版) 课后习题题目及答案 第一章】
  • 【英语】100个句子记完7000个托福单词
  • 六、CANdelaStudio入门-通信参数编辑
  • 【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解
  • Java中mybatis是否支持延迟加载?延迟加载的原理是什么?
  • 真题详解(磁盘)-软件设计(五十八)
  • MATLAB连续时间信号的实现和时域基本运算(八)
  • MongoDB 聚合管道中使用字符串表达式运算符
  • 用Python分析周杰伦歌曲并进行数据可视化
  • 培训技能 GET
  • 数据库安全性案例分享
  • 2023,你了解Kafka吗?深入详解
  • 奇舞周刊第 491 期 初探 Web 客户端追踪技术
  • 【Java】什么是SOA架构?与微服务有什么关系?
  • 【中间件】kafka
  • Html5版音乐游戏制作及分享(H5音乐游戏)
  • Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练
  • 【运动规划算法项目实战】如何实现简单的状态机
  • JavaScript实现用while语句计算1+n的和的代码
  • Three.js教程:顶点索引复用顶点数据
  • 机器学习中的数学——学习曲线如何区别欠拟合与过拟合