多标签用户画像分析跑得快的关键在哪里?

用户画像分析需要使用众多标签来描述用户属性,通常有两类标签。一类用户标签的值可能有多个,比如用户学历是中学、大学、研究生、博士等,年龄段是children、juvenile、youth、middle age、old age,这类标签称为枚举标签。另一类用户标签的值只有两个,比如用户是否注册、是否活跃、是否白领、是否某种促销的目标用户等等,这类标签称为二值标签。

在用户画像分析场景中,往往要对这两类标签的组合条件做过滤计算,例如:查询出中年、大学学历、注册、活跃用户,并且是去年黑五大促的目标用户。

总数据量很巨大时,运算性能的瓶颈常常集中在这个条件过滤上。这些条件非常随意,无法预先计算或指望索引,必须要有高效的硬遍历能力。这时候,对枚举标签和二值标签采用的存储和计算方法就非常关键了。

在关系数据库、数据仓库中,枚举标签也就是个普通字段,相应的过滤计算是在WHERE子句中用IN来完成,一般是d IN (d1,…,dn)的形式,即字段 d 取值包含于值集合 {di,…} 时为真。IN计算的性能较差,主要由于其中有太多的比较运算。要判断字段d是否包含在值集合中,如果采用顺序查找,需用d与值集合中的成员做1到n次的比较计算。即使在值集合有序的情况下用二分法查找,也要比较数次。数据量较大时比较次数会非常多,判断IN 的速度就会很慢,而且值集合越大速度越慢。

枚举标签过滤性能优化的关键是消除其中的比较运算。首先,确定 IN 字段(即写成IN条件前面的字段)可能取值的列表。可能值通常不会太多,这个列表也不会太长。然后转换原数据,把 IN 字段值替换为列表中对应记录的序号(位置),另存成一份新数据。

对替换后的新数据做 IN 判断时,先要生成一个与列表等长的布尔值集合,其第 i 个值由列表的第 i 个成员是否在 IN 字段的值集合中决定,在其中就是true,不在就是false。遍历时,用 IN 字段值(列表的序号)去取布尔值集合中的成员,是true就符合过滤条件,否则就不符合。

这种方法本质上是将“集合值比较”转换为“序号引用”,省去了比较计算,性能会大幅提升。而且计算时间和值集合大小无关,不会随着 IN条件中枚举值的增多而增加。

SQL中一般不支持通过序号(位置)直接取集合成员的方法,要用关联表过渡,会导致更复杂的JOIN运算,不能直接实现这种优化方法。

二值标签在数据库中一般用布尔型字段来存储。如果只有几个或几十个,那就简单地把过滤条件写在 WHERE 中就可以了。但标签总数有可能达到成百上千个。很多数据库表不支持这么多字段,还要分成多个表再做 JOIN。在数据量很大时,大表连接的性能非常差。

为了避免大表连接,还可以把几千个布尔字段转列为行,用一个“标签号”字段存储,计算时先分组再过滤、统计。但这个分组结果集很大,需要外存缓存,性能还是很差。

如果用整数的二进制位来存储二值标签(0,1 各代表一个取值),那么 16 位短整数就能存 16 个标签,100 个整型字段就能存 1600 个标签,可以有效减少字段数量,避免大表连接。

但是,很多数据库还不支持这种位相关的计算,也就不能实现这种性能优化方法。

开源数据计算引擎 SPL支持序号引用位式运算,可以很方便地实现上述优化方法。相应的SPL代码也很简单,例如原数据表T_ordinary中的字段包括:用户id、枚举标签字段dName(比如年龄段:children、juvenile、youth、middle age、old age)、16个布尔标签字段flag1到flag16,以及金额字段amt。其中,dName的取值范围在选项表dim中。下面的代码可以完成序号引用和位式存储的转换:

A
1 =file("T_ordinary.ctx").open().cursor(id,dName,flag1,flag2,…,flag16,amt)
2 =T("dim.btx")
3 =A1.new(id,dim.pos@b(dName):d,bits(flag1,flag2,…,flag16):b,amt)
4 =file("T.ctx").create(id,d,b,amt)
5 =A4.append(A3)

A3用pos函数将dName的值替换为dim中的序号,存成新字段d。dim预先按照 dName有序,这里用二分法查找速度更快。同时使用 bits 函数把 16 个标签字段转换成一个16位整数字段b。

转换好的表T就可以做高性能的标签过滤和统计了。例如,过滤条件是dName取值在前端传入的集合[“middle age”,“old age”]中,且标签 flag4、flag8 为 1。 完成过滤之后,按照d分组汇总金额和记录数,代码大致是这样的:

A
1 =bits(0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0)
2 =T("dim.btx").(["middle age","old age"].contain@b(~))
3 =file("T.ctx").open().cursor(amt;A2(d) && and(b,A1)==A1)
4 =A3.groups(d;sum(amt),count(~))

A1用bits函数生成16位小整数,第4、8位值是1,对应标签 flag4、flag8。A2生成布尔值集合。A3利用布尔值集合和小整数做过滤计算。

在使用SPL的虚表后,还可以把这些变换过的字段透明化,直接像普通字段一样使用。比如:基于表T定义虚表T_pseudo后,上述代码大致会变成这样:

A
1 =T_pseudo.select(flag4 && flag8 && ["middle age","old age"].contain@b(dName))
2 =A3.groups(dName;sum(amt),count(~))

flag4、flag8是虚表中定义的位维度字段,对应T表中b字段的第4、8位。dName则是虚表中的枚举维度字段,其值是T表中的d字段序号对应的名称。

有了虚表后,实际的存储和计算方法不变,SPL会自动完成上述算法。而且,过滤条件中可以使用普通的布尔值,结果集中分组值也会变成容易阅读的字符串,不必再做序号和名称的转换。虚表的具体使用方法参见SPL 虚表的数据类型优化。

SPL资料

  • SPL下载
  • SPL源代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软通动力华为java机考题库_华为机考笔试刷题-java-1

题库来源计算字符个数写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNextLi…

基于Java+Springboot+Vue+elememt社区疫情返乡管控系统设计实现

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取联系🍅精彩专栏推荐订阅收藏👇&…

策略 python_Python版商品期货多品种均线策略

完全移植自「CTP商品期货多品种均线策略」,由于Python版本商品期货策略还没有一个多品种的策略,所以就移植了JavaScript版本的「CTP商品期货多品种均线策略」。提供一些Python商品期货多品种策略的设计思路、例子。不论JavaScript版本还是Python版本&…

mc用云服务器搭建_最全的云服务器架设我的世界私服教程,不看后悔哦!

我们将通过一个一步步的讲述通过新睿云的云服务器来向你展示如何搭建一个“我的世界(Minecraft)”服务器端。这是一个可以多人在线的游戏,能让您体会到极致的游戏乐趣。我们的建议是不要使用个人电脑,即使从技术角度来说你能做到,但个人电脑不…

基于Java+SpringBoot+vue等疫情期间在线网课管理系统详细设计实现

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取联系🍅精彩专栏推荐订阅收藏👇&…

智能家居中语音识别算法研究_语音识别研究获进展

中国科学院自动化研究所智能交互团队在环境鲁棒性、轻量级建模、自适应能力以及端到端处理等几个方面进行持续攻关,在语音识别方面获新进展,相关成果将在全球语音学术会议INTERSPEECH2019发表。现有端到端语音识别系统难以有效利用外部文本语料中的语言学…

自动驾驶技术越来越火,浅谈一些对百度Apollo开放平台8.0的看法和认知

最近几年来,包括我在内的很多开发者们,都投身进入了智能汽车领域,其实不论是初学者还是大佬,接触智能汽车开发行业后都需要学习很多知识和既能。 我在最近一段时间接触到了百度的Apollo开放平台,上手的感觉很好用&…

mysql模糊查询 or_mysql的模糊查询

mysql模糊查询like/REGEXP(1)like / not likeMySql的like语句中的通配符:百分号、下划线和escape%:表示任意个或多个字符。可匹配任意类型和长度的字符。Sql代码select * from user where username like %huxiao;select * from user where us…

命令行输入mysql不行_MySQL命令行无法插入中文数据

下面的方法是针对window系统的注意:1 下面的my.ini文件在有些版本的Mysql中的安装目录找不到,比如我用的版本5.5.60-log就找不到,想要找到这个文件,需要设置显示window系统隐藏文件(不懂的自行百度,因系统的版本不同而…

mysql查看现在使用的引擎_mysql查看当前库使用的引擎及简单操作

随手写下一些操作mysql现在已提供什么存储引擎:mysql> show engines;mysql当前默认的存储引擎:mysql> show variables like %storage_engine%;某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):mysql> show create table 表名;如何查看My…

mysql 获取天数_MySQL获取某月份的天数

1、last_day(curdate());获取当月最后一天。2、DAYOFMONTH(last_day(curdate())); 返回date对应的该月日期。当然这就是当月的天数。这就出来当月天数了,相当简单。最初的时候去网上找的下面的内容。虽然逻辑上没错,但是思路有点问题,mysql那…

mysql 表损坏_MYSQL数据表损坏的原因分析和修复方法小结(推荐)

1.表损坏的原因分析以下原因是导致mysql 表毁坏的常见原因:1、 服务器突然断电导致数据文件损坏。2、 强制关机,没有先关闭mysql 服务。3、 mysqld 进程在写表时被杀掉。4、 使用myisamchk 的同时,mysqld 也在操作表。5、 磁盘故障。6、 服务…

mysql的存储过程和索引区别_mysql查看索引与存储过程

mysql查看索引与存储过程创建索引:CREATE INDEX可对表增加普通索引或UNIQUE唯一索引。CREATE INDEX index_name ON table_name (column_list)CREATE UNIQUE INDEX index_name ON table_name (column_list)ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY主键。ALTER TAB…

mysql悲观锁关键字_MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

MySQL悲观锁 select for update实现秒杀案例(jfinal框架)发布时间:2018-08-17作者:laosun阅读(4287)为了方便测试,博主使用最新的jfinal框架,里边的东西就修改了一下a_little_config.txt,配置数据库链接的,…

pl sql 连接mysql_PL/SQL 连接mysql步骤

下面就将PL/SQL的配置说明一下。一、安装Oracle客户端,让后配置 安装目录下面的C:\ORACLE\instantclient_11_2\NETWORK\ADMIN 的 tnsnames.ora文件,如下:修改成自己的配置名 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 服务器IP)(PORT…

mysql 创建表时提示错误代码_MySQL创建表时遇到的错误

学习MySQL第一个程序就遇到了bug。创建表时需注意的事项加以总结: 1、先创建数据库: create database 数据库名;然后连接要用的数据库 use 数据库名;下面就可以执行建表语句 了。2、错误提示:ERROR 1064 (4…

根据工序画出aoe网_这些金刚网纱窗竟然含“毒”!选错就得病

窗户进行装修我们通常会安装纱窗,这样可以阻止一些蚊虫或者灰尘进入家里。金刚网纱窗是业主们常常挑选的一种纱窗。不过最近听别人说金刚网纱窗是含毒的,这不禁让安装这种纱窗的业主感到吃惊,而这消息是真是假呢我们看看专家的说法&#xff0…

7 centos 时钟跟物理机同步_centos7上使用chrony自动同步时间

在linux中,有些服务必须依靠准确的时间,才能够在运行的时候不出差错,例如DNS,LVS,HTTPS等,都需要后台的服务器之间保持时间的同步。而Centos系统中自带的有安装对应的同步时间的服务。centos7中默认安装的是…

mysql key_mysql 索引 key 的用法

mysql 索引 key 的用法mysql> desc aa;-------------------------------------------| Field | Type | Null | Key | Default | Extra |-------------------------------------------| id | int(11) | YES | | NULL | |-------------------------------…

防火墙阻止网页连接网络连接_win7电脑打不开网页怎么办 win7电脑打不开网页解决步骤【图文步骤】...

我们在使用电脑的过程当中,经常都会浏览一些网页,不过最近有位win7系统用户在使用电脑浏览网页的时候却遇到了网页打不开网页的问题,这导致了很多事情都无法操作,其实网页打不开的问题,一般都跟网络有关,那…