Mahout源代码学习(一)数据存储结构

1.      Preference

Mahout把用户对商品的评价抽象为Preference,Preference为一个接口,实现类有GenericPreference和BooleanPreference,架构图如下:

Mahout源代码学习(一)数据存储结构_第1张图片

以GenericPreference为例:

把userID、itemID、和该用户对该商品的打分value封装成一个类。

而BooleanPreference类中没有value值,而getValue()方法直接返回1,说明只要new了这个类就默认表示该用户对该商品是喜爱的,故value返回1。

2.      PreferenceArray

按普通想法,有了Preference这个类封装用户对商品的打分信息后,应该用一个arraylist去记录所有用户对所有商品的打分信息。但其实在mahout的数据模型中是没有用到上面所说的Preference类的。

Mahout中其实是用PreferenceArray类直接记录某个用户对所有商品的打分信息。

PreferenceArray也是个接口,实现类有GenericItemPreferenceArray、GenericUserPreferenceArray、BooleanItemPreferenceArray、BooleanUserPreferenceArray,架构图如下:

Mahout源代码学习(一)数据存储结构_第2张图片

还是以GenericUserPreferenceArray为例:

这里id是记录userID,ids[]记录itemIDs,values[]记录该用户对itemIDs的打分,结构如下:

Mahout源代码学习(一)数据存储结构_第3张图片

而在GenericItemPreferenceArray中id就记录一个itemID,ids就记录userIDs(代表这个商品被哪些用户喜欢)。

BooleanItemPreferenceArray和BooleanUserPreferenceArray类似,只是没有values数组。

3.      DataModel

以上这些其实都是为最终的存储模型做准备的,mahout工程中对输入数据最终的存储结构式这样的:

Mahout还重新定义了map为FastByIDMap,以FastByIDMap为例,从输入数据后形成了如下的存储结构:

Mahout源代码学习(一)数据存储结构_第4张图片

其中key就是userID,value就是GenericUserPreferenceArray对象。

这样组织的目的是为了节约空间(有待进一步了解)。

这些数据机构的最终载体就是DataModel接口,具体实现比较复杂,详见下图:

Mahout源代码学习(一)数据存储结构_第5张图片

常用的GenericDataModel类就封装了上述的数据结构,具体成员变量有如下几个(都很重要):

         preferenceFromUsers以userID为MAP的key,GenericUserPreferenceArray为value记录用户对商品的打分;

         preferenceFromItems以itemID为MAP的key,GenericItemPreferenceArray为value记录商品被用户打分的分值。

GenericDataModel的构造函数如下:


Timastamps不考虑,可见userData就是FastByIDMap 类(一般传入的PreferenceArray就是以GenericUserPreferenceArray实现的),构造函数的工作主要有两个:1.把传入的userData封装到preferenceFromUsers中。2.把preferenceFromUsers转换到preferenceFromItems中。

另外在GenericDataModel中还定义了很多方法以实现快速获取用户喜好数据或者商品被喜好数据列表。

你可能感兴趣的:(Mahout)