• 向MapReduce转换:通过部分成绩计算矩阵乘法


    代码共分为四部分:


    <strong><span style="font-size:18px;">/***
     * @author YangXin
     * @info 封装共现关系列
     */
    package unitSix;
    import java.io.IOException;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.mahout.cf.taste.hadoop.item.VectorOrPrefWritable;
    import org.apache.mahout.math.VectorWritable;
    
    public class CooccurrenceColumnWrapperMapper extends Mapper<IntWritable, VectorWritable, IntWritable, VectorOrPrefWritable>{
    	public void map(IntWritable key, VectorWritable value, Context context) throws IOException, InterruptedException{
    		context.write(key, new VectorOrPrefWritable(value.get()));
    	}
    }
    </span></strong>

    <strong><span style="font-size:18px;">/***
     * @author YangXin
     * @info 切割用户数量
     */
    package unitSix;
    
    import java.io.IOException;
    import java.util.Iterator;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.mahout.cf.taste.hadoop.item.VectorOrPrefWritable;
    import org.apache.mahout.math.VarLongWritable;
    import org.apache.mahout.math.Vector;
    import org.apache.mahout.math.VectorWritable;
    
    public class UserVectorSplitterMapper extends Mapper<VarLongWritable, VectorWritable, IntWritable, VectorOrPrefWritable>{
    	public void map(VarLongWritable key, VectorWritable value, Context context) throws IOException, InterruptedException{
    		long userID = key.get();
    		Vector userVector = value.get();
    		Iterator<Vector.Element> it = userVector.nonZeroes().iterator();
    		IntWritable itemIndexWritable = new IntWritable();
    		while(it.hasNext()){
    			Vector.Element e = it.next();
    			int itemIndex = e.index();
    			float preferenceValue = (float)e.get();
    			itemIndexWritable.set(itemIndex);
    			context.write(itemIndexWritable, new VectorOrPrefWritable(userID, preferenceValue));
    		}
    	}
    }</span></strong>


    <strong><span style="font-size:18px;">/***
     * @author YangXin
     * @info 计算部分推荐向量
     */
    package unitSix;
    import java.io.IOException;
    import java.util.List;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.mahout.cf.taste.hadoop.item.VectorAndPrefsWritable;
    import org.apache.mahout.math.VarLongWritable;
    import org.apache.mahout.math.Vector;
    import org.apache.mahout.math.VectorWritable;
    
    public class PartialMultiplyMapper extends Mapper<IntWritable, VectorAndPrefsWritable, VarLongWritable, VectorWritable>{
    	public void map(IntWritable key, VectorAndPrefsWritable vectorAndPrefsWritable, Context context) throws IOException, InterruptedException{
    		Vector cooccurrenceColumn = vectorAndPrefsWritable.getVector();
    		List<Long> userIDs = vectorAndPrefsWritable.getUserIDs();
    		List<Float> prefValues = vectorAndPrefsWritable.getValues();
    		for(int i = 0; i < userIDs.size(); i++){
    			long userID = userIDs.get(i);
    			float prefValue = prefValues.get(i);
    			Vector partialProduct = cooccurrenceColumn.times(prefValue);
    			context.write(new VarLongWritable(userID), new VectorWritable(partialProduct));;
    		}
    	}
    }
    </span></strong>


    <strong><span style="font-size:18px;">/***
     * @author YangXin
     * @info 实现部分成绩的combiner
     */
    package unitSix;
    
    import java.io.IOException;
    
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.mahout.math.VarLongWritable;
    import org.apache.mahout.math.Vector;
    import org.apache.mahout.math.VectorWritable;
    
    public class AggregateCombiner extends Reducer<VarLongWritable, VectorWritable, VarLongWritable, VectorWritable>{	
    	public void reduce(VarLongWritable key, Iterable<VectorWritable> values, Context context) throws IOException, InterruptedException{
    		Vector partial = null;
    		for(VectorWritable vectorWritable : values){
    			partial = partial == null ? vectorWritable.get() : partial.plus(vectorWritable.get());
    		}
    		context.write(key, new VectorWritable(partial));
    	}
    }
    </span></strong>




  • 相关阅读:
    LTPA Cookie原理
    如何对更改internet密码所需的缓存时间进行调整?
    Freemem eclipse查看内存的小插件
    Java中static、final用法小结
    MANIFEST.MF内容属性名详细解释
    Java程序员的良药:应用程序的开发技巧
    spring struts2 ibatis框架整合开发
    java中静态代码块的用法 static用法详解 类的加载顺序
    从svn上直接导入项目到workspace中
    Eclipse自动生成UML图 Green UML和ModelGoon(直接推拽)
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7213931.html
Copyright © 2020-2023  润新知