我正在阅读Mahout in Action一书并试用分布式推荐引擎示例。但我没有使用维基百科数据集,而是使用一个小数据集作为我的例子。
input.txt->
1,15
1,13
1,12
1,10
2,11
2,15
2,20
2,17
2,12
3,10
user.txt->
3
其中input.txt和user.txt的格式为user,item
,input.txt表示用户过去购买的商品,user.txt代表当前购买
当我在hdfs中复制这两个文件并运行
时hadoop jar mahout-core-0.5-job.jar \ org.apache.mahout.cf.taste.hadoop.item.RecommenderJob \ -Dmapred.input.dir = input / input.txt \ -Dmapred.output.dir = output --usersFile input / user.txt --booleanData
地图缩小正常运行。但是当我检查bin/hadoop fs -cat output/
part-r-00000
我找到一个空文件。
有人可以解释我出了什么问题吗? 如果我理解正确,推荐人工作应该已经构建了项目与项目相似度矩阵,将其与用户项目矩阵(来自user.txt)相乘并生成结果。
需要一些帮助理解。我在一个节点上使用Mahout 0.5和hadoop 1.2。我希望它不是版本兼容性问题。
修改
如果我将user.txt更改为
,我会得到答案2
或
1
答案 0 :(得分:1)
首先使用Mahout 0.9或当前的源码构建。 0.5很老了,过时了。我知道它已在本书中使用,但许多示例仍然适用于较新的代码。
其次,您的数据中很少发生共存。如果您想了解推荐人的工作方式,请尝试使用此博客post使用此类小型数据集很容易产生同步,这会导致空推荐。在帖子中有一个非常小的数据集,旨在产生一些recs但不会为所有用户生成recs。
第三,确保为所有项目和用户使用Mahout ID。这意味着用户x项矩阵中的行号和列号。对于项目ID,它们必须为0到项目数 - 减1,对于用户ID,它们必须为0到用户数量减去1。使用其他任何东西都会导致虚假的结果。几个Mahout 1.0 Spark作业已删除此限制,您可以使用任何唯一字符串。但是Hadoop mapreduce代码仍然需要这些ID