hadoop計算二度人脈關系推薦好友
阿新 • • 發佈:2018-04-22
轉載 xtend java class .class text 去重 QQ -m
作者:topwqp
鏈接:https://www.jianshu.com/p/8707cd015ba1
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
https://www.jianshu.com/p/8707cd015ba1
問題描述:
以下是qq好友關系,進行好友推薦,比如:老王和二狗是好友 , 二狗和春子以及花朵是好友,那麽老王和花朵 或者老王和春子就有可能也認識,可以對老王推薦春子和或花朵作為好友。
註意以下是制表符:tab建,所以程序中用 /t進行分割
老王 二狗
老王 二毛
二狗 春子
二狗 花朵
老王 花朵
花朵 老王
春子 菊花
問題分析
問題分析:
主 ---> 從
從 --->主
分別列出每一個關系,然後都列出從-->主
這樣去重後每個人可以有一個關系集合,然後對這個集合中的每個元素求笛卡爾積,記得到可能的關系
比如:
老王 -->二狗
二狗--->老王
這是一對主從 從主
然後:可以對二狗求出一個集合
如下進行全面列出:
老王 二狗
二狗 老王
二狗 春子
二狗 花朵
這樣 二狗進行合並後就是 老王 春子 和 花朵 組成一個集合,然後對集合中的每個元素求笛卡爾積即可
編程實現:
mapper實現 分離主 從 從 主
package com.topwqp.mr;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
public class QQMapper extends Mapper<LongWritable,Text,Text,Text>{
@Override
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
String line = value.toString();
//通過制表符進行分割
String[] lineDatas = line.split("\t");
context.write(new Text(lineDatas[0]), new Text(lineDatas[1]));
context.write(new Text(lineDatas[1]), new Text(lineDatas[0]));
}
}
reduce實現去重和笛卡爾積
package com.topwqp.mr;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;
import java.util.*;
public class QQReduce extends Reducer<Text,Text,Text,Text>{
@Override
protected void reduce(Text key, Iterable<Text> i,
Reducer<Text, Text, Text, Text>.Context context) throws IOException,
InterruptedException {
// TODO Auto-generated method stub
//首先進行去重
Set<String> set = new HashSet<String>();
for(Text t:i){
set.add(t.toString());
}
//每個元素都拿出來,計算笛卡爾積 如果只有一個元素,就不用求笛卡爾積,直接列出即可
if(set.size()>1){
for(Iterator j = set.iterator();j.hasNext();){
String name =(String)j.next();
for (Iterator k = set.iterator(); k.hasNext();) {
String other = (String) k.next();
//排除自己
if(!name.equals(other)){
context.write(new Text(name), new Text(other));
}
}
}
}
}
}
JobRun編寫
package com.topwqp.mr;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class QQJobRun {
public static void main(String[] args) {
//configuration中配置的key value和 配置文件下的conf/mapred-site.xml保持一致
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "localhost:9001");
conf.addResource(new Path("/Users/wangqiupeng/Documents/xplan/bigdata/hadoop-1.2.1/conf/core-site.xml"));
conf.addResource(new Path("/Users/wangqiupeng/Documents/xplan/bigdata/hadoop-1.2.1/conf/hdfs-site.xml"));
conf.set("mapred.jar", "/Users/wangqiupeng/Downloads/qq.jar");
try{
Job job = new Job(conf);
job.setJobName("qq");
//當前類是運行入口
job.setJarByClass(QQJobRun.class);
//mapper類
job.setMapperClass(QQMapper.class);
//reducer類
job.setReducerClass(QQReduce.class);
//最終統計結果輸出類型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setNumReduceTasks(1);//設置reduce任務的個數,默認是一個
//mapreduce 輸入數據所在的目錄或者文件
FileInputFormat.addInputPath(job, new Path("/Users/wangqiupeng/Documents/xplan/bigdata/data/hadoop-1.2.1/input/qq/"));
//mapreduce執行之後的輸出數據的目錄 這個輸出路徑的部分目錄可以沒有,如果沒有會自動創建
FileOutputFormat.setOutputPath(job, new Path("/Users/wangqiupeng/Documents/xplan/bigdata/data/hadoop-1.2.1/output/qq/"));
//等待job完成退出
System.exit(job.waitForCompletion(true) ? 0 :1);
}catch(Exception e){
e.printStackTrace();
}
}
}
執行結果:
作者:topwqp
鏈接:https://www.jianshu.com/p/8707cd015ba1
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
hadoop計算二度人脈關系推薦好友