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

一、背景

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

举个现实中的例子:

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

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

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

二、解决思路

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

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

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

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

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

三、具体实现

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

hbase写入时设置列的时间
@Test
    public 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();
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统)

环境: DELL7080台式机 Ubuntu20.04 两块硬盘 问题描述: 没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统) 解决方案: 一、下载镜像文件 1.上线自行下载安装镜像文件 二、分区 1.win10下磁盘管理压缩2个分区一个10G左右制作安装盘,一个几百G安装系统使用 10…

辞了外包,上岸字节我落泪了,400多个日夜没人知道我付出了多少....

前言&#xff1a; 没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年3月&#xff0c;我有幸成为了字节跳动的一名自动化测试工程师&am…

Node.js的简介

一、什么是node.js Node.js是JavaScript语言的服务器运行环境。 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎&#xff0c;V8引擎执行…

基于 SpringBoot+Vue+Java 的留守儿童系统的研究与实现(附源码,教程)

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 1.研究背景 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&#xff0c;传统的管理方式已经无法满足现代人们的需求&#xff1b;使用留…

PCL学习二:PCL基础应用教程

参考引用 PCL Basic UsagePCL 点云库官网教程 1. pcl_viewer 基本使用 1.1 pcl_viewer 安装测试 pcl_data 源码克隆$ git clone https://github.com/PointCloudLibrary/data.git进入 /pcl_data/tutorials&#xff08;如下图&#xff09;$ cd ~/pcl_data/tutorials # 此处为重…

Chapter 4 :Constraining I/O Delay(ug903)

4.1 About Constraining I/O Delay 要在设计中准确地建模外部时序上下文&#xff0c;必须为输入和输出端口提供时序信息。由于XilinxVivado集成设计环境&#xff08;IDE&#xff09;只能识别FPGA边界内的时序&#xff0c;因此必须使用以下命令来指定超出这些边界的延迟…

200人 500人 园区网设计

实验要求&#xff1a; ① 设置合理的STP优先级、边缘端口、Eth-trunk ② 企业内网划分多个vlan &#xff0c;减少广播域大小&#xff0c;提高网络稳定性 ③ 所有设备&#xff0c;在任何位置都可以telnet远程管理 ④ 出口配置NAT ⑤ 所有用户均为自动获取ip地址 ⑥ 在企业…

Matlab高光谱遥感、数据处理与混合像元分解及典型案例

站在学员的角度去理解“高光谱”&#xff0c;用大家能听的懂的语言去讲述高光谱的基本概念和理论&#xff0c;帮助学员深入理解这项技术的底层科学机理。方法篇&#xff0c;将高光谱技术与MATLAB工具结合起来&#xff0c;采用MATLAB丰富的工具箱&#xff0c;快速复现高光谱数据…

Java 重写(Override)与重载(Overload)

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不…

【MySQL自学之路】第4天——模式、表、视图、索引(数据定义详细版)

目录 前言 数据库 数据库的建立 数据库的使用 数据库的查看 数据库的删除 模式 查看所有的模式 模式和数据库之间的关系 ​编辑建立模式 删除模式 表 数据类型 查看一个数据库下面的所有表(必须进入要查看的数据库) 创建基本表 查看表结构&#xff08;查看表建…

Arduino学习笔记5

一.直流电机控制实验 1.源代码 int dianJiPin9;//定义数字9接口接电机驱动IN1的控制口void setup() {pinMode(dianJiPin,OUTPUT);//定义电机驱动IN1的控制口为输出接口 } void loop() {digitalWrite(dianJiPin,LOW);//关闭电机delay(1000);//延时digitalWrite(dianJiPin,HIGH…

【Vue 基础】vue-cli初始化项目及相关说明

目录 1. 创建项目 2. 项目文件介绍 3. 项目的其它配置 3.1 项目运行时&#xff0c;让浏览器自动打开 3.2 关闭eslint校验功能 3.3 src文件夹简写方法 1. 创建项目 vue create 项目名 2. 项目文件介绍 创建好的项目中包含如下文件&#xff1a; &#xff08;1&#xff09…

工具链和其他-超级好用的web调试工具whistle

目录 whistle介绍 整体结构 能力 规则 6个使用场景示例 1.修改Host 2.代理 3.替换文件&#xff08;线上报错时&#xff09; 4.替换UA 5.远程调试 6.JS注入 互动 whistle介绍 整体结构 安装&#xff1a; npm install whistle -g cli&#xff1a;whistle help 启动…

算法之时间复杂度---数据结构

目录 前言&#xff1a; 1.时间复杂度 1.1时间复杂度的理解 1.2规模与基本操作执行次数 1.3大O渐进表示法 1.4计算基本操作的次数 2.常见的时间复杂度及其优劣比较 ❤博主CSDN&#xff1a;啊苏要学习 ▶专栏分类&#xff1a;数据结构◀ 学习数据结构是一件有趣的事情&…

什么是Web1.0时代、Web2.0时代、Web3.0时代?

什么是Web1.0时代、Web2.0时代、Web3.0时代&#xff1f; 互联网的起源。1969年美国的阿帕网的出现标志着互联网的诞生&#xff0c;而1973年第一台个人电脑The Xerox Alto的出现就预示了互联网将蓬勃生长&#xff0c;随之而来的就是我们迈入了信息时代。短短几十年的发展&#x…

浏览器缓存策略:强缓存和协商缓存

浏览器缓存&#xff1a;其实就是在本地使用的计算机中开辟一个内存区&#xff0c;同时也开辟一个硬盘区&#xff0c;作为数据传输的缓冲区&#xff0c;然后利用这个缓冲区来暂时保护用户以前访问的信息通常浏览器的缓存策略分为两种&#xff1a;强缓存和协商缓存&#xff0c;强…

零基础学java——【基础语法】基本输入、输出语句,变量,运算符

目录 变量 数据类型 基本数据类型一览表 声明和初始化 基本的输出、输出语句 输出语句 补充“”的使用 输入语句Scanner 使用步骤 代码演示 运算符 有些内容可能会与c语言作比较 内容借鉴了韩顺平老师的java课堂笔记&#xff08;b站课&#xff09; 变量 数据类型 基本…

CKA证书题库-总结

CKA真题&#xff08;考题总结&#xff09; 文章目录 CKA真题&#xff08;考题总结&#xff09;证书个人考试总结申诉结果 CKA题目参考博主重点介绍 CKA模拟题库 注意事项考试概要考试注意事项&#xff1a; CKA题目答案设置自动补全方法一方法二 第⼀题&#xff1a;权限控制RBAC…

【4. ROS的主要通讯方式:Topic话题与Message消息】

【4. ROS的主要通讯方式&#xff1a;Topic话题与Message消息】 1. 前言1.1 王者解释结点通讯&#xff1a;1.2 通讯小结 2. 灵活的Topic话题图解2.1 话题注意细节2.2 外延补充 3. Message消息图解3.1 消息类型3.2 查看标准消息类型std_msgs 4. 使用C实现Publisher发布者4.1 发布…

Sametime 12.0.1 FP1发布以及Notes中的SwiftFile使用

大家好&#xff0c;才是真的好。 上周&#xff0c;HCL推出了Sametime 12.0.1FP1FP1更新包程序&#xff0c;包含不少新功能以及很多修复程序。虽然Sametime组件现在不需要运行在Domino服务器上&#xff0c;但毕竟Sametime通常会使用Domino目录或Domino中的LDAP目录服务&#xf…