用户画像系统中有一个很重要的功能点: 基于标签圈人。这里有个很核心的概念,什么是标签?
标签是简化用户表示的一种思维方式。 刻画用户的标签越多,用户画像就越立体。 比如:
90后,码农,宅男 3个标签就刻画了一类人。标签类似于戏曲中的脸谱来表现人物的性格和特征。
标签有哪些类型呢?
枚举类标签: 描述性别,地理位置。这类标签取值通常是可枚举出来的。
时间类标签: 描述业务触达和流失时间信息。 注: 时间类标签可存储成数值。
数值类标签: 比如账户金额,积分数量等。
所以本质上,标签只有两种: 离散枚举和连续数值。
有了标签后,如何在计算机中建模存储呢?
最简单最直观的方式就是设置大宽表,即每个标签一个字段。 通常一个小型的画像系统,有几百个标签足够。所以对于大部分场景宽表足够简单可依赖。
宽表一般存储在Hive中,出于性能考虑,会存储到Impala中。当数据量较大时,Impala也一般无法满足查询的性能需求。这是因为Impala没有索引,每次查询都是扫表。所以,为了能够利用索引提升性能,大宽表一般会从Impala转存到Elasticsearch中。
当一个用户Id附着成百上千个标签,按ES存储方式,会相当耗费存储资源,导入数据到ES也会成为性能瓶颈。 所以变通的方案是将所有的标签存储到ES的一个array字段中。但本质上,还是大宽表的方案。
大宽表的方案最大的问题: 新增标签时间成本太大,所以画像系统基本是T+1的实效性。 如果对响应时间没有苛刻的要求,基于Hadoop生态的ad hoc查询引