2013-05-17 4 views
2

분산 mahout recommender 작업 org.apache.mahout.cf.taste.hadoop.item.RecommenderJob 어떻게 중복 및 triplicate 사용자 항목 항목이 존재하지만 다른 환경 설정 값을 가진 CSV 파일을 처리 궁금 해서요. 내가
1,2,0.3
1,3,0.7
1,3,-0.7
중복 사용자, 항목 enteries 있지만 다른 환경 설정 값을 가진 Mahout Datamodel


1,1,0.7
1,2,0.7
같은 항목을했다 .csv 파일이 있다면 예를 들어, 어떻게 두싯의 데이터 모델은이 문제를 해결할 것인가? 주어진 사용자, 항목 입력 (예 : 사용자 항목 1,2의 경우 기본 설정이 (0.7 + 0.3))에 대한 기본 설정 값을 요약하거나 값을 평균화합니까 (예 : 사용자 항목 1,2의 기본 설정은 (0.7 + 0.3)/2) 또는 감지 한 항목 항목 (예 : 사용자 1,2의 경우 기본 설정 값은 0.3으로 설정)에 대한 최종 사용자 기본값이 기본값입니다.

여러 환경 설정 메트릭 (항목보기, 좋아요, 싫어요, 장바구니에 저장 등)을 기반으로 권장 사항을 검토 중이므로이 질문을드립니다. 데이터 모델이 선호도 값을 선형 가중치 (예 : 항목보기 및 희망 사항에 저장하는 것이 항목보기보다 선호도 점수가 높음)로 처리하면 도움이됩니다. 데이터 모델이 이미 합산하여 처리하는 경우 추가 map-reduce를 사용하면 여러 메트릭을 기준으로 총 점수를 정렬하고 계산할 수 있습니다. 누구든지 mahout .csv 데이터 모델에서 제공 할 수있는 명확한 설명은이 점에서 org.apache.mahout.cf.taste.hadoop.item.RecommenderJob에 대한 것이므로 정말로 감사하겠습니다. 감사.

+0

이 수단은 K R 알고리즘의 구현을 사용하여 해결 될 수있는 것 같다. 정보를 공유하고 싶었습니다. – 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); 
    } 
}