做图书馆网站的语言,wordpress优化指南,wordpress新建php页面,jpress和wordpress一、背景
前面系列文章介绍了用户画像的概念、用户画像的标签加工、用户画像的应用。本篇文章主要介绍一些画像的技术细节#xff0c;让大家更加详细的了解画像数据存储和处理的逻辑
举个现实中的例子#xff1a;
例子1#xff1a;因为疫情原因#xff0c;上线一个平台(…一、背景
前面系列文章介绍了用户画像的概念、用户画像的标签加工、用户画像的应用。本篇文章主要介绍一些画像的技术细节让大家更加详细的了解画像数据存储和处理的逻辑
举个现实中的例子
例子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));ArrayListPut 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 {MapString, Long cellTTL new HashMap();cellTTL.put(name, 1L);//单位天cellTTL.put(age, 2L);//单位天ListDelete 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) {ListCell 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();
}
上面给出了一个简单版本的过期策略处理代码