从数据库底层说起,探究用户画像系统的储存该如何选型(代码片段)

YO哥教你大数据 YO哥教你大数据     2023-01-12     326

关键词:

1.什么是用户画像

在给用户画像做定义之前,我们先来了解一下什么是推荐系统

场景:

在现在的互联网时代,网上购物已经称为常态,当我们在各大电商平台购物的时候,不难发现这样一个现象。当你搜索某个上面进行浏览的时候,点击目标商品,之后返回到首页,很大概率你就可以发现,你刚才搜索的商品的相关产品已经在首页的推荐栏目。例如,你购买了一件护肤品面霜,回到首页推荐处,系统可能就会给你推荐口红或者相关护肤品。又例如当你搜索用户画像书籍的时候,推荐栏目就会出现有关用户画像的书籍。这些功能就叫做推荐,而完成这些行为的即为推荐系统。

本质:

推荐系统就是对用户的浏览行为进行记录分析,并基于这些行为对用户将要购买的商品进行预测。老王购买了用户画像的书籍,那么老王便与这本书之间产生一个连接。小丽购买了护肤品,那么小丽便于这个护肤品之间产生了连接。而推荐系统就是根据一些算法去预测用户与商品之间还未产生的连接。

来看一张简单的用户画像表:

客户ID客户年龄所在省份生日性别购物喜好
00122广东20000821电子产品
00222北京20000908科技类书籍
00323河北19991201化妆品

给用户画像下定义:

  • 用户画像是对用户的一种标注,通过给用户打上标签的形式来描述用户

  • 这个标签可以是一个人的年龄,性别,收入情况,也可以是一个人的购物倾向或者是常居住地

  • 总而言之我们能想到的用来描述一个人的各方面特征的都可以算作是画像的范畴

2.用户画像在储存方面的要求
  • 画像表相对比较稀疏,一般一个用户画像的项目至少有近百个标签,而大部分用户都应该只打上一部分呢标签,所以总体来说画像表应该较为稀疏

  • 大部分标签使用ID进行匹配查找,定位到用户标签再找到用户群体

  • 进行聚合统计的需求较多

  • 需要数据库可以按key查询,聚合统计查询,以及多条件组合查询

  • 稀疏表的储存不应该占用太多空间资源

3.一号选手:Mysql

mysql这个数据库大家应该都不陌生,这里我们从这个数据库的底层结构开始说起,mysql底层所选用的数据结构为B+树,说到B+树这里就不得不提一下另一种数据结构B数

B树介绍

上图是一个 B树 的形式, 每个节点有两个数据元素, 每个节点有三个子节点, 每个叶子节点有两个数据元素

无论是什么形式的 B树, 都具备以下定理, 这四个定理也是保证 B树 插入和删除能够平衡的原因

  1. 根节点至少两个子节点
  2. 每个中间节点都包含 m 个孩子, 每个中间节点都包含 m - 1 个数据元素
  3. 最底层的节点称之为叶子节点, 所有叶子节点都位于同一层
  4. 所有节点中的数据元素按照大小排列, 所有子节点按照数据元素的大小排列, 父节点的数据元素恰好是子节点数据元素的值域划分点

B树插入规则:

  • 如果当前节点未满, 插入
  • 如果当前节点已满, 分裂节点, 中间大小的值提升, 直到插入根节点
  • 如果根节点也已满, 插入节点成为新的根节点, 层级 +1

B树存在的问题:

  • 因为 B树 中所有节点都可携带数据元素, 所以导致性能不稳定
  • 范围查找效率太低

基于B树存在的这些问题,B+树出现了

B+树:

B+树的特性:

  • 有 k 个子树的中间节点, 就可以存放 K 个数据元素(比 B树 多一个)
  • 中间节点不保存数据, 只用来索引, 划分子树值域, 所有数据元素都以卫星的形式和叶子节点关联
  • 叶子节点本身按照 Key 有序
  • 所有中间节点的元素都存在于子节点

B+数的优点:

  • 单一节点存储更多的元素, IO 次数变少
  • 所有查询都要查找到叶子节点, 看起来每次都是都是最差情况, 但是三层的 B+树 可以存放一百万条数据, 通常 B+树 都很低很宽
  • 所有叶子节点是形成有序链表, 范围查询性能极强

B+树与MySql的关系:

聚集索引:

非聚集索引:

MySQL的索引类型:

  • 在 MySQL 中, 有两个引擎, 如下

    • MyISAM,引擎, 事务支持很差, 较少使用
    • InnoDB,引擎, 事务支持完备, 使用较广泛

    InnoDB 的特点

    • 任何一张表的数据都自带一个聚集索引
    • 默认情况下, 建表必须有主键, 默认的聚集索引以主键为 Key

总的来说,无论是否聚集, MySQL 中的索引都是 B+树 结构

MySQL特性总结:

  • 根据 B+树 的特性可以知道, 每次在插入的时候都比较复杂, 当数据量增多的时候, 性能衰减会非常明显
  • B+树 是查找树, 其节点之间是有序的, 当需要搜索的时候, 时间复杂度和折半查找一样, 只有 Log2N
  • B+树 的叶子节点构成了一个类似链表的结构, 所以进行范围查找的时候, 不需要回到父节点, 可以直接在子节点中进行, 所以在进行一些复杂查询的时候比较方便范围取数据
  • 因为 MySQL 的主要目的是 OLTP, OLTP 更强调每次操作一条或者多条数据, 所以 MySQL 是行存储的形式, 行存储为了对齐所有的列, 即使某列为 Null, 也依然会有按照数据类型的占位

MySQL存在的问题:

  • 插入性能会随着树的复杂度而递减
  • 数据多的话会导致树变得很宽,这个时候插入数据就复杂度就变高了
  • 随着数据量不断增加,树从插入性能就下架了
4.二号选手:Hbase

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,参考谷歌的BigTable后使用java语言进行了实现。也是Apache软件基金会的Hadoop项目的一部分,可以运行运行在HDFS文件系统容错地存储海量稀疏的数据。

先来说说LSM-Tree

LSM-Tree全称是Log Structured Merge Tree,是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高出很多。

如图为LSM-Tree日志合并树

当我们的log以这种格式写入的时候,全部都是以Append的模式追加的,不存在删除和修改,这种结构虽然大大提升了数据的写入能力,但是以牺牲部分读取性能为代价,索引这种结构通常适合于写多读少的场景。故LSM被设计来提供比传统的B+树或者ISAM更好的写操作吞吐量。

Hbase与LSM-Tree

HBase 的一个表有多个 Region 分布在多个 RegionServer 上, 一个 RegionServer 有多个 Region

每个 Region 又分为 Memstore 和 DiskStore, 其实就是 LSM树

HBase 的存储结构是 Key-Value

虽然 HBase 对外提供的看起来好像一种表, 但其实在 Region 中, 数据以 KV 的形式存在

一级缓存: BlockCache

  • MySQL 的 B+树 并不是把数据直接存放在树中, 而是把数据组成 页(Page) 然后再存入 B+树, MySQL 中最小的数据存储单元是 Page

  • HBase 也一样, 其最小的存储单元叫做 Block, Block 会被缓存在 BlockCache 中, 读数据时, 优先从 BlockCache 中读取

  • BlockCache 是 RegionServer 级别的

  • BlockCache 叫做读缓存, 因为 BlockCache 缓存的数据是读取返回结果给客户端时存入的

二级缓存: 当查找数据时, 会先查内存, 后查磁盘, 然后汇总返回

  • 因为写是写在 Memstore 中, 所以从 Memstore 就能立刻读取最新状态
  • Memstore 没有的时候, 扫描 HFile, 通过布隆过滤器优化读性能

综上所述:

  • HBase 是 LSM树 的一种开源实现, 类似的还有 LevelDB, RocketDB 等
  • HBase 无论是批量写还是实时写, 性能都超过 MySQL 不少
  • HBase 的查询只有一种, 就是扫描, Get 也是扫描的一种特殊情况, 所以 HBase 的查询能力不强
  • HBase 以 KV 的形式存储数据, 所以如果某一单元数据为 Null 则不存, 所以 HBase 适合存储比较稀疏的表
5.用户画像储存选型

对上面所提到的数据库再进行一次总结:

MySQL

  • 随着数据的增多, 插入性能递减
  • 查找延迟低
  • 范围查询优势明显, 可以实现复杂的查询
  • 完整存储所有数据, 不适合稀疏表

Hbase

  • HBase 无论是批量写还是实时写, 性能都超过 MySQL 不少
  • HBase 的查询只有一种, 就是扫描, Get 也是扫描的一种特殊情况, 所以 HBase 的查询能力不强
  • HBase 以 KV 的形式存储数据, 所以如果某一单元数据为 Null 则不存, 所以 HBase 适合存储比较稀疏的表

MySQL VS Hbase

  1. 从存储形式上来看, 选 HBase, HBase 是 KV 型数据库, 是不需要提前预设 Schema 的, 添加新的标签时候比较方便
  2. 从使用方式上来看, 选 MySQL 似乎更好, 但是 HBase 也可以, 因为并没有太多复杂查询
  3. 从写入方式上来看, 选 HBase, 因为画像的数据一般量也不小, HBase 可以存储海量数据, 而 MySQL 不太适合集群部署

总结:

最终选择的方案为HBase,其实在大数据的生态圈中还存在着很多数据储存的工具,例如Hive,ES等等,在特定的情况下这些输出储存工具也是可取的。

006_理解inode

...高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)... 查看详情

大数据从0到一(hadoop)(代码片段)

...并以多副本的储存在多个机器上数据切分多副本容错是对用户不可见的操作的对象依然是文件YARN负责整个集群资源的管理和调度内存cpu进行控制扩展性容错性多框架资源统一管理MapReduce拓展性&容错性&海量数据离线处理Hado... 查看详情

惠州制造业mes系统该如何选型?看完你就知道了

...、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等管理模块,为企业打造一个扎实、可靠、全面、可行的制造协同管理平台。因此在工业4.0的浪潮中,越来越多的企业开始选择 查看详情

从“如何设计用户超过1亿的应用”说起----数据库调优实战

摘要: 作为SaaS服务提供商,数万乃至数十万级用户是业务架构设计上一开始就必须面对的问题。庞大的用户群以及海量的用户数据意味着基础设施的构建必须兼顾高效与稳定,更经济、扩展更方便的云服务平台就成为了首... 查看详情

1.用户画像:方法论与工程化解决方案---用户画像基础(代码片段)

本书可以帮助读者在用户画像领域形成一个体系化的思维,在面对一个具体项目时不会无从下手。 如何建立标签指标体系? 指标体系中包含哪些标签? 如何设计存储画像标签的表结构? 如何开发标签? 画像... 查看详情

用mirror,搞定用户画像

Mirror产品概述 Mirror是专为金融行业设计的全面用户画像管理系统。该系统基于星环多年来为多个金融企业客户构建用户画像的经验,深入契合业务需求,实现对用户全方位全维度的刻画。Mirror内置银行业和证券业的用户画像... 查看详情

《用户网络行为画像》读书笔记

推荐就是发掘用户集合和对象集合的语义关系,为用户提供语义最相关的TOP-N对象集合。语义关系就是能读懂用户偏好兴趣的核心。推荐系统是面向具体业务的交叉研究,无业务讲推荐系统,感觉言之无物;从技术来讲,不同的... 查看详情

产品经验谈:什么是用户画像?用户画像的一些应用案例

前言用户画像也是近几年比较热的一个词,不过很多小伙伴对于画像的认知还只是标签化的层面,或者只是利用其做一些简单的分群分析;如何全面地认知并做系统性地尝试,背后有非常多的点需要我们深思挖掘。今天就根据自... 查看详情

如何构建用户画像

 从1991年TimBerners-Lee发明了万维网(WorldWideWeb)开始,到20年后2011年,互联网真正走向了一个新的里程碑,进入了“大数据时代”。经历了12、13两年热炒之后,人们逐渐冷静下来,更加聚焦于如何利用大数据挖掘潜在的... 查看详情

微信小程序是如何设计百亿级用户画像分析系统的?(代码片段)

...如何设计,在介绍基础标签模块之后,重点讲解用户分群模块设计。希望相关的技术实现思路,能够对你有所启发。背景介绍1)画像系统简述“We分析”是小程序官方推出的数据分析平台, 查看详情

2-1用户画像

...提高决策效率  精准营销:数据挖掘、用户推荐的底层支持 构建用户画像操作步骤数据收集&挖掘  数据收集方法包括:数据埋点(知道某商品浏览量)、产品后台统计数据、用户访谈、问卷调研打标签 &... 查看详情

ios开发探究--内存分配和分区

ios内存分配与分区1.RAM和ROMRAM:运行内存,不能掉电储存.ROM:储存性内存,可以掉电储存,例如:内存卡,flash由于RAM类型不具备掉电储存能力(即一掉电数据就会丢失),所以app程序一般存放于ROM中,RAM的访问速度要远高于ROM,价格也要高2.APP... 查看详情

分布式数据库选型之争

转载自:分布式数据库选型之争:数据库向左,中间件向右近些年来,随着数据规模增加、数据使用复杂度提高,对底层数据库能力要求越来越高,传统集中式数据库已不能满足需要;分布式数据库成为必然的选择。金融行业,... 查看详情

持久层框架jpa与mybatis该如何选型

...ORM框架的规范,对该规范的实现比较完整就是SpringDataJPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内。Mybatis也是一个优秀的数据持久层框架,能比较好的支持ORM实体关系映射、动态SQL... 查看详情

django基于用户画像的电影推荐系统源码(项目源代码)(代码片段)

...码本系统是以Django作为基础框架,采用MTV模式,数据库使用MongoDB、MySQL和Redis,以从豆瓣平台爬取的电影数据作为基础数据源,主要基于用户的基本信息和使用操作记录等行为信息来开发用户标签,并使用Hadoop... 查看详情

用户研究(上)

...里,根据具体发展需要,研究大小用户群体的行为特点与底层机制,给出专业洞见与可落地建议用研常用方法:  核心研究模型:  用户研究工作原则:1.科学的研究框架设计,严谨的逻辑论证链条2.比用户更无知... 查看详情

产品经验谈:什么是用户画像?用户画像的一些应用案例

前言用户画像也是近几年比较热的一个词,不过很多小伙伴对于画像的认知还只是标签化的层面,或者只是利用其做一些简单的分群分析;如何全面地认知并做系统性地尝试,背后有非常多的点需要我们深思挖掘。今天就根据自... 查看详情

利用python搭建用户画像系统

用户画像是当下很多企业都会提及的概念,多数情况下会和大数据以及营销挂钩。本文将对用户画像的相关知识进行进行简单的介绍,并利用Python去实现一个简单的用户画像系统。1.什么是用户画像用户画像可以理解成是... 查看详情