在这次作业中,我们将进行电影数据集的处理: https://raw.githubusercontent.com/sidooms/MovieTweetings/master/latest/ratings.dat (https://raw.githubusercontent.com/sidooms/MovieTweetings/master/latest/ratings.dat) 在数据集中,每一行包含了用户的电影评分(user1 对Titanic的打分为10). 这是数据集的格式:user_id::movie_id::rating::timestamp (用户id::电影id::打分::时间戳) 在这次作业中,对于每一对电影A和B,你需要找到所有的同是给电影A和B用户。比如,给出下面的数据集(为了便于说明,我们在示例中分别使用U和M表示用户和电影)。 U1::M1::2::11111111 U2::M2::3::11111111 U2::M3::1::11111111 U3::M1::4::11111111 U4::M2::5::11111111 U5::M2::3::11111111 U5::M1::1::11111111 U5::M3::3::11111111 假设用户名和电影名是string格式的,评分是整数格式的。你应该忽略mapper里的timestamp(时间戳) 你的输出格式应该如下所示: (M1,M2) [(U5,1,3)] (M2,M3) [(U5,3,3),(U2,3,1)] (M1,M3) [(U5,1,3)] 其中(M,M)表示成对的电影,[ ]表示用户的list及其评分。比如,(U5,1,3)表示 U5对M1和M2的评分分别为1和3. (请注意你的输出结果格式应该要和上面的输出示例一样) 提示: 在这次作业中,你可能需要实现不止Mapper/Reducer。你需要看看以下的MapReduce链接:https://stackoverflow.com/questions/38111700/chaining-of-mapreduce- jobs#answer-38113499 (https://stackoverflow.com/questions/38111700/chaining-of-mapreduce- jobs#answer-38113499) 你可能也需要self-join去寻找电影对,reduce-side join pattern可以帮助:https://www.edureka.co/blog/mapreduce-example-reduce-side-join/ (https://www.edureka.co/blog/mapreduce-example-reduce-side-join/) 如果Mapper的key和value不同于Reduce的key和value,你需要设置以下的配置:job.setMapOutputKeyClass(), job.setOutputKeyClass(), job.setMapOutputValueClass(), job.setapOutputValueClass() 不要使用Combiner(job.setCombiner()) 如果Mapper/Reducer的value是一个复杂的object,你需要去实现Writerable Interface class 如果Mapper/Reducer的key是一个复杂的object,你也需要实现WritableComparable Interface 你可以使用ArrayWritable去存储Array values,但是你需要实现它的toString()函数以便能够将object可入文本文件。 请注意reducer中的迭代值(Iterable values)。当循环遍历迭代value list时,每个object instance(对象实例)在reducer中被循环使用。所以如果你讲他们添加到另一个list时,在流程结束时,新列表中的所有元素都将与您添加到列表中的最后一个对象相同。 提交截止时间: 2019/10/25