# HadoopCompositeKey
**Repository Path**: icyorg/HadoopCompositeKey
## Basic Information
- **Project Name**: HadoopCompositeKey
- **Description**: Hadoop中Composite Key的应用
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2016-03-26
- **Last Updated**: 2022-10-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
目标:
社交网络中的社群发现 Community Detection in Online Social Networks
背景:
在社交网络中,相似度高的用户通常被认为属于同一“社区”。在非对称关系社交网络中(如微博,可以单向关注其他用户),相似度的衡量方式之一是根据两个用户共同关注的其他用户数量。

A-->B表示A关注了B。如上图所示的社交网络中,A关注了{B,C,E},B关注了{A,C,E}。
待解决问题:
根据给出的用户关注关系,找出每个用户相似度最高(即共同关注用户数量最多)的前10个用户。
文件输入格式:
**被**关注用户:用户1, 用户2,……
如在上图所示的结构中,对应的文件输入格式为——
A:B D
B:A
C:A B E
E:A B C
_--与背景中所给出的集合表示的关系相反_
结果输出格式:
用户1:相似用户top1, 相似用户top2,……,相似用户top10
用户2:相似用户top1, 相似用户top2,……,相似用户top10
问题解决方式:
利用Hadoop中组合键(Composite Key),将MapReduce中使用的key替换为由(用户,相似用户)构成的组合键。如上图中,由于B、D共同关注了A,所以他们构成两个组合键(B,D)和(D,B),每个key对应value为1,进行类似WordCount的过程。
由于key的结构发生了变化,所以需要自定义comparator,且需要注意在不同阶段使用不同的comparator,如下所示
```
//Define the comparator that controls which keys are grouped together
//for a single call to combiner, Reducer.reduce
job.setCombinerKeyGroupingComparatorClass(PairGroupingComparator.class);
//Define the comparator that controls which keys are grouped together
//for a single call to Reducer.reduce
job.setGroupingComparatorClass(PairGroupingComparator.class);
//Define the comparator that controls how the keys are sorted
//before they are passed to the Reducer.
job.setSortComparatorClass(CompositeKeyComparator.class);
```