在给用户画像做定义之前,我们先来了解一下什么是推荐系统
场景:
在现在的互联网时代,网上购物已经称为常态,当我们在各大电商平台购物的时候,不难发现这样一个现象。当你搜索某个上面进行浏览的时候,点击目标商品,之后返回到首页,很大概率你就可以发现,你刚才搜索的商品的相关产品已经在首页的推荐栏目。例如,你购买了一件护肤品面霜,回到首页推荐处,系统可能就会给你推荐口红或者相关护肤品。又例如当你搜索用户画像书籍的时候,推荐栏目就会出现有关用户画像的书籍。这些功能就叫做推荐,而完成这些行为的即为推荐系统。
本质:
推荐系统就是对用户的浏览行为进行记录分析,并基于这些行为对用户将要购买的商品进行预测。老王购买了用户画像的书籍,那么老王便与这本书之间产生一个连接。小丽购买了护肤品,那么小丽便于这个护肤品之间产生了连接。而推荐系统就是根据一些算法去预测用户与商品之间还未产生的连接。
来看一张简单的用户画像表:
客户ID | 客户年龄 | 所在省份 | 生日 | 性别 | 购物喜好 |
---|---|---|---|---|---|
001 | 22 | 广东 | 20000821 | 男 | 电子产品 |
002 | 22 | 北京 | 20000908 | 男 | 科技类书籍 |
003 | 23 | 河北 | 19991201 | 女 | 化妆品 |
给用户画像下定义:
用户画像是对用户的一种标注,通过给用户打上标签的形式来描述用户
这个标签可以是一个人的年龄,性别,收入情况,也可以是一个人的购物倾向或者是常居住地
总而言之我们能想到的用来描述一个人的各方面特征的都可以算作是画像的范畴
画像表相对比较稀疏,一般一个用户画像的项目至少有近百个标签,而大部分用户都应该只打上一部分呢标签,所以总体来说画像表应该较为稀疏
大部分标签使用ID进行匹配查找,定位到用户标签再找到用户群体
进行聚合统计的需求较多
需要数据库可以按key查询,聚合统计查询,以及多条件组合查询
稀疏表的储存不应该占用太多空间资源
mysql这个数据库大家应该都不陌生,这里我们从这个数据库的底层结构开始说起,mysql底层所选用的数据结构为B+树,说到B+树这里就不得不提一下另一种数据结构B数
B树介绍:
上图是一个 B树 的形式, 每个节点有两个数据元素, 每个节点有三个子节点, 每个叶子节点有两个数据元素
无论是什么形式的 B树, 都具备以下定理, 这四个定理也是保证 B树 插入和删除能够平衡的原因
m
个孩子, 每个中间节点都包含 m - 1
个数据元素B树插入规则:
B树存在的问题:
基于B树存在的这些问题,B+树出现了
B+树:
B+树的特性:
B+数的优点:
B+树与MySql的关系:
聚集索引:
非聚集索引:
MySQL的索引类型:
在 MySQL 中, 有两个引擎, 如下
InnoDB 的特点
总的来说,无论是否聚集, MySQL 中的索引都是 B+树 结构
MySQL特性总结:
MySQL存在的问题:
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 缓存的数据是读取返回结果给客户端时存入的
二级缓存: 当查找数据时, 会先查内存, 后查磁盘, 然后汇总返回
综上所述:
对上面所提到的数据库再进行一次总结:
MySQL
Hbase
MySQL VS Hbase
总结:
最终选择的方案为HBase,其实在大数据的生态圈中还存在着很多数据储存的工具,例如Hive,ES等等,在特定的情况下这些输出储存工具也是可取的。