专栏首页木东居士的专栏闲聊用户画像的存储

闲聊用户画像的存储

0x00 前言

随便聊一下用户画像的存储。

现在的用户画像,动不动就是几千几万个标签,标签一多就出现了一些需要克服的难题,比如下面两个:

  1. 如何解决频繁新增和删除标签的场景
  2. 如何解决不同标签更新时间和频率不同的问题

0x01 数据模型设计

从个人角度来讲,在大数据领域接触比较多的的存储引擎有这几个:Hive(Hdfs)、Hbase、ES。这也会是我们在选择存储系统中几个主要的备选方案。

优缺点就不再分析了。我们切入正题:数据模型该怎么设计?

一、横表

以Hive为例,我们最常用的就是横表,也就是一个 key,跟上它的所有标签。比如下面是一个简单的横表。

用户ID

性别

年龄

学历

职业

月薪

月消费能力

001

28

本科

程序员

10k-20k

1k-2k

002

23

大专

销售

不详

100-200

那么用横表有什么问题吗?有的,其实也就是前言里面提到的:

  1. 由于用户的标签会非常多,而且随着用户画像的深入,会有很多细分领域的标签,这就意味着标签的数量会随时增加,而且可能会很频繁。
  2. 不同的标签计算频率不同,比如说学历一周计算一次都是可以接收的,但是APP登录活跃情况却可能需要每天都要计算。
  3. 计算完成时间不同,如果是以横表的形式存储,那么最终需要把各个小表的计算结果合并,此时如果出现了一部分结果早上3点计算完成,一部分要早上10点才能计算完成,那么横表最终的生成时间就要很晚。
  4. 大量空缺的标签会导致存储稀疏,有一些标签会有很多的缺失,这在用户画像中很常见。

嗯,上述的问题,主要是当标签数量开始快速增多的时候会遇到的问题。标签量少的时候其实是不用担心这些的。

那么这些问题该怎么解决呢?这就是下面要聊得竖表。

二、竖表

竖表长下面这个样子:

用户ID

标签名

标签值

001

sex

001

salary_month

10k-20k

002

sex

002

age

23

这里就不再列举全部内容了,大概介绍一下,竖表其实就是将标签都拆开,一个用户有多少标签,那么在这里面就会有几条数据。

竖表能比较好地解决上面宽表的问题。但是它也会带来了新的问题,比如说多标签组合的查询需求:“我们想看年龄在23-30之间,月薪在10-20k之间,喜欢听古典音乐的女性”,这种多标签查询条件组合情况在竖表中就不太容易支持。

三、横表+竖表

如前面所分析,竖表和横表各有所长和所短,那么能不能两者结合呢?

这其实也要考虑横表和竖表的特性,整体来讲就是竖表对计算层支持的好,横表对查询层支持的好。那么设计的化就可以这样:

0x02 如何存储?

关于存储,我们以前文说的第三种方案为例。

标签的计算我们可以使用Hive、Spark这些计算引擎,这个没什么问题,然后就是这些标签的单独存储可以以Hive为主来存储。

那么在导入标签竖表的时候可以考虑两种存储引擎:Hive(Hdfs)和Hbase,其实笔者更倾向于Hbase,因为如果存在Hbase里的话会更方便查询。顺便再打上一个时间标签,用起来就更方便了。

最后,标签宽表的话可以考虑ES。另外需要注意的就是,从竖表往宽表到数据的时候需要做一层数据的加工,而且考虑到数据稀疏的情况的话,需要在宽表存储这里做一些优化。

本文分享自微信公众号 - 木东居士(Data_Engineering),作者:木东居士

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何有效推进百万标签库的治理?

    在大多数公司,成千上万的标签虽然在某种程度上是数据服务能力的象征,但到最后往往成为了一种负担,只管杀不管埋的现象太普遍了!

    木东居士
  • 用户画像实践:神策标签生产引擎架构

    导读:用户画像是建立在数据基础之上的用户模型,是产品改进、精准营销等业务场景中不可或缺的重要基础。而构建用户画像的过程就是要给用户打上各种维度的标签,并基于标签...

    木东居士
  • 漫谈机器学习之小知识点总结

    木东居士
  • 【JavaWeb】83:js不能算是一门编程语言?

    因为才刚开始学js,所以很多话不敢说的太绝对,就加上了“基本,大概,可能”这样的形容词。

    刘小爱
  • HTML中的容器标签

    什么是容器标签?在HTML开发中我们常常会使用一类标签作为容器放置一些内容,我们把这类标签称之为容器标签,可以作为容器标签的包括列表标签、表格标签、框架标签、布...

    一墨编程学习
  • JavaWeb(十三)简单标签

    用户定义的一种自定义的jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作...

    leeqico
  • 用户画像实践:神策标签生产引擎架构

    导读:用户画像是建立在数据基础之上的用户模型,是产品改进、精准营销等业务场景中不可或缺的重要基础。而构建用户画像的过程就是要给用户打上各种维度的标签,并基于标签...

    木东居士
  • 互联网进入标签时代

    最近有三个产品的改版引起了我的注意:一个是网易跟帖上线了标签功能,用户可以给其他跟帖用户打上特定标签,看上去是为了提升互动性和实现用户自运营;第二是百度图片搜索...

    罗超频道
  • 【CSS选择符】后代选择符

    在学习后代选择符之前,首先要了解一下组成一个网页的HTML家谱,每个HTML标签标示其中一个家庭成员。网页中的第一个HTML标签(标签),相当于所有其他标签的始...

    企鹅号小编
  • HTML标签分类

    在HTML页面中,带有“<>”符号的元素被称为HTML标签,如 <HTML>、<head>、<body>、<head>等都是HTML骨架结构标签。所谓标签就是放...

    爱知汇

扫码关注云+社区

领取腾讯云代金券