public void map(IntWritable key, VectorWritable value, Context context) throws IOException, InterruptedException { context.write(key, new VectorOrPrefWritable(value.get())); } }
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.iterateNonZero(); 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)); } } }
/** * tests {@link ToVectorAndPrefReducer} */ @Test public void testToVectorAndPrefReducer() throws Exception { Reducer<VarIntWritable,VectorOrPrefWritable,VarIntWritable,VectorAndPrefsWritable>.Context context = EasyMock.createMock(Reducer.Context.class); context.write(EasyMock.eq(new VarIntWritable(1)), vectorAndPrefsWritableMatches(Arrays.asList(123L, 456L), Arrays.asList(1.0f, 2.0f), MathHelper.elem(3, 0.5), MathHelper.elem(7, 0.8))); EasyMock.replay(context); Vector similarityColumn = new RandomAccessSparseVector(Integer.MAX_VALUE, 100); similarityColumn.set(3, 0.5); similarityColumn.set(7, 0.8); VectorOrPrefWritable itemPref1 = new VectorOrPrefWritable(123L, 1.0f); VectorOrPrefWritable itemPref2 = new VectorOrPrefWritable(456L, 2.0f); VectorOrPrefWritable similarities = new VectorOrPrefWritable(similarityColumn); new ToVectorAndPrefReducer().reduce(new VarIntWritable(1), Arrays.asList(itemPref1, itemPref2, similarities), context); EasyMock.verify(context); }
/** * tests {@link ToVectorAndPrefReducer} in the error case that two similarity column vectors a supplied for the same * item (which should never happen) */ @Test public void testToVectorAndPrefReducerExceptionOn2Vectors() throws Exception { Reducer<VarIntWritable,VectorOrPrefWritable,VarIntWritable,VectorAndPrefsWritable>.Context context = EasyMock.createMock(Reducer.Context.class); EasyMock.replay(context); Vector similarityColumn1 = new RandomAccessSparseVector(Integer.MAX_VALUE, 100); Vector similarityColumn2 = new RandomAccessSparseVector(Integer.MAX_VALUE, 100); VectorOrPrefWritable similarities1 = new VectorOrPrefWritable(similarityColumn1); VectorOrPrefWritable similarities2 = new VectorOrPrefWritable(similarityColumn2); try { new ToVectorAndPrefReducer().reduce(new VarIntWritable(1), Arrays.asList(similarities1, similarities2), context); fail(); } catch (IllegalStateException e) { // good } EasyMock.verify(context); }