2013-05-17 59 views
2

我想知道分佈式mahout推薦作業org.apache.mahout.cf.taste.hadoop.item.RecommenderJob如何處理csv文件,其中重複和三重用戶項目條目存在但具有不同的首選項值。舉例來說,如果我有這樣的有一個像

1,1,0.7
1,2,0.7
1,2,0.3
1,3,0.7
1,3,-0.7
Mahout Datamodel具有重複的用戶,項目Enteries但不同的首選項值

項.csv文件將如何亨利馬烏的數據模型處理呢?它會總結給定用戶的偏好值,項目條目(例如,對於用戶項目1,2,偏好將是(0.7 + 0.3)),還是它平均值(例如,對於用戶項目1,2,偏好是(0.7 + 0.3)/ 2),還是默認爲最後一個用戶,它檢測到的項目條目(例如,對於用戶1,2,優先值設置爲0.3)。

我問這個問題,因爲我正在考慮基於多種偏好度量(項目視圖,喜歡,不喜歡,保存到購物車等)的建議。如果數據模型將偏好值視爲線性權重(例如,項目視圖加上保存到期望列表具有比項目視圖更高的偏好分數)將是有幫助的。如果datamodel已經通過求和來處理這個問題,那麼它將爲我節省額外映射的繁瑣工作 - 減少根據多個指標對總分數進行排序和計算。任何澄清任何人可以提供mahout .csv datamodel作品在這方面的org.apache.mahout.cf.taste.hadoop.item.RecommenderJob將非常感激。謝謝。

+0

看起來,這可以通過使用K均值算法的ř執行來解決。只是想分享信息。 – Swamy

回答

5

不,它會覆蓋。該模型不具有可加性。然而,這個代碼的衍生物Myrrix中的模型(我正在商業化)有一個基本上可加的數據模型,只是出於你的理由。輸入值是權重並且總是被添加。

+0

謝謝,肖恩澄清。因此,如果我理解正確,如果Mahout的'hadoop.item.RecommenderJob'將一個長csv文件作爲輸入(例如在EMR作業中),則特定對的首選項值將設置爲元組出現在csv文件最遠處? – Astronaut7

+0

我甚至不認爲你有這樣的保證......有不同的映射器以不同的順序讀取可能的許多輸入。它們出現在減速器上的順序不能保證。當然,Mahout中的假設是你在輸入中沒有重複的鍵。 –

+0

謝謝,肖恩,及時回覆!這爲我清除了很多東西。 – Astronaut7

1

在開始計算之前合併它。

例子:

import java.io.IOException; 
import java.util.Iterator; 
import java.util.StringTokenizer; 

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.FloatWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 
import org.apache.hadoop.mapred.TextInputFormat; 
import org.apache.hadoop.mapred.TextOutputFormat; 

public final class Merge { 
    public Merge() { 
    } 

    public static class MergeMapper extends MapReduceBase implements 
      Mapper<LongWritable, Text, Text, FloatWritable> { 

     public void map(LongWritable key, Text value, OutputCollector<Text, FloatWritable> collector, 
       Reporter reporter) throws IOException { 
      // TODO Auto-generated method stub 
      String line = value.toString(); 
      StringTokenizer tokenizer = new StringTokenizer(line); 
      if (tokenizer.hasMoreTokens()) { 
       String userId = tokenizer.nextToken(","); 
       String itemId = tokenizer.nextToken(","); 
       FloatWritable score = new FloatWritable(Float.valueOf(tokenizer.nextToken(","))); 
       collector.collect(new Text(userId + "," + itemId), score); 
      } 
      else { 
       System.out.println("empty line " + line); 
      } 

     } 
    } 

    public static class MergeReducer extends MapReduceBase implements 
      Reducer<Text, FloatWritable, Text, FloatWritable> { 

     public void reduce(Text key, Iterator<FloatWritable> scores, 
       OutputCollector<Text, FloatWritable> collector, Reporter reporter) throws IOException { 
      // TODO Auto-generated method stub 
      float sum = 0.0f; 
      while (scores.hasNext()) { 
       sum += scores.next().get(); 
      } 
      if (sum != 0.0) 
       collector.collect(key, new FloatWritable(sum)); 
     } 
    } 


    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 

     JobConf conf = new JobConf(Merge.class); 
     conf.setJobName("Merge Data"); 

     conf.setOutputKeyClass(Text.class); 
     conf.setOutputValueClass(FloatWritable.class); 

     conf.setMapperClass(MergeMapper.class); 
     // combine the same key items 
     conf.setCombinerClass(MergeReducer.class); 
     conf.setReducerClass(MergeReducer.class); 

     conf.setInputFormat(TextInputFormat.class); 
     conf.set("mapred.textoutputformat.separator", ","); 
     conf.setOutputFormat(TextOutputFormat.class); 

     FileInputFormat.setInputPaths(conf, new Path("hdfs://localhost:49000/tmp/data")); 
     FileOutputFormat.setOutputPath(conf, new Path("hdfs://localhost:49000/tmp/data/output")); 

     JobClient.runJob(conf); 
    } 
} 
相關問題