阿里大数据题目,请问怎么设计算法比较好呢

来源:互联网 发布:联通手机网络id 编辑:程序博客网 时间:2024/04/29 11:35
某B2C网站有1亿用户和200万商品,每一个用户都有自己喜欢的若干件商品,如果两个用户都喜欢同一件商品,我们定义中两个用户有一个“同好商品”,“同好度”为两个用户的同好商品数和这两个用户中至少有一人喜欢的商品数的比值。同好度衡量了两个用户之间的商品喜好的接近程序,这有着十分重要的用途。
  请设计一个算法,计算每一个用户的同好用户集合及同好度。
  输入数据:多个文件,每个文件的数据有多行,每一行的数据格式如下:用户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用来查询用户的爱好数量)

0 0
原创粉丝点击