请设计一个算法,计算每一个用户的同好用户集合及同好度。
输入数据:多个文件,每个文件的数据有多行,每一行的数据格式如下:用户ID喜欢的商品ID1 喜欢的商品ID2 .......喜欢的商品n,其中用户ID和商品ID均为32位整数,中间以空格分隔。
如:
16 1001 1002 3003
输出数据:一个或多个文件,每一行的数据格式如下:
用户ID 同好用户ID1:同好度 同好用户ID2:同好度...... 同好用户IDn:同好度
中间以空格隔开。算法可以描述为伪代码。
我觉得如果你知道mapreduce 你就应该知道思路
如果不知道mapreduce 我说了思路也没用
不过anyway
假设数据没有冗余(如果有先dedup处理)
第一组mapreduce
mapper输入的是源文件的一行,输出1是kv<商品id, 用户id>,就是从商品到用户的逆映射,输出2是kv<用户id, 爱好数量>
reducer输入是mapper的输出1,输出的是kv<A用户id, B用户id> 和kv<B用户id, A用户id>
第二组mapreduce
mapper输入是第一组reducer的输出,直接输出数据
reducer输入的是mapper的输出,输出的是kv<用户id, list<pair<同好用户, 同好度>>> ,计算方法是每个用户累加同好用户出现次数,最后的和就是同好商品数量(交集的size),用两个用户的爱好数量之和减去交集size就是并集的size,自然可以算出同好度(第一组mapper的输出2在内存中建hashmap用来查询用户的爱好数量)
我觉得如果你知道mapreduce 你就应该知道思路
如果不知道mapreduce 我说了思路也没用
不过anyway
假设数据没有冗余(如果有先dedup处理)
第一组mapreduce
mapper输入的是源文件的一行,输出1是kv<商品id, 用户id>,就是从商品到用户的逆映射,输出2是kv<用户id, 爱好数量>
reducer输入是mapper的输出1,输出的是kv<A用户id, B用户id> 和kv<B用户id, A用户id>
第二组mapreduce
mapper输入是第一组reducer的输出,直接输出数据
reducer输入的是mapper的输出,输出的是kv<用户id, list<pair<同好用户, 同好度>>> ,计算方法是每个用户累加同好用户出现次数,最后的和就是同好商品数量(交集的size),用两个用户的爱好数量之和减去交集size就是并集的size,自然可以算出同好度(第一组mapper的输出2在内存中建hashmap用来查询用户的爱好数量)