import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.util.Iterator;
import java.util.StringTokenizer;
class Map extends Mapper<Object, Text, Text, Text>{
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException{
if ( value.toString().contains("factoryname") || value.toString().contains("addressID") ){
return;
}
String line = value.toString();
StringTokenizer str = new StringTokenizer(line);
String flag = new String();
String firstStr = new String();
String secondStr = new String();
if ( str.nextToken().length() == 1){
flag = "2";
firstStr = line.substring(0, 1);
secondStr = line.substring(2);
context.write( new Text(firstStr), new Text(flag+" "+secondStr) );
}
else {
flag = "1";
firstStr = line.substring(0, line.length()-2);
secondStr = line.substring(line.length()-1);
context.write( new Text(secondStr), new Text(flag+" "+firstStr) );
}
}
}
class Reduce extends Reducer<Text, Text, Text, Text>{
private static int time = 0;
public void reduce(Text key, Iterable<Text> values,Context context)
throws IOException, InterruptedException{
if (time == 0){
context.write(new Text("addressID"), new Text("addreddname"));
time++;
}
Iterator<Text> ite = values.iterator();
int factoryNum = 0;
int addressNum = 0;
String[] factory = new String[10];
String[] address = new String[10];
while (ite.hasNext()){
String str = ite.next().toString();
if (str.charAt(0) == '2'){
address[addressNum] = str.substring(2);
addressNum++;
}
else{
factory[factoryNum] = str.substring(2);
factoryNum++;
}
}
if(factoryNum != 0 && addressNum != 0){
for (int m = 0; m < factoryNum; m++) {
for (int n = 0; n < addressNum; n++) {
context.write(new Text(factory[m]), new Text(address[n]));
}
}
}
}
}
public class MTjoin{
public static void main(String[] args) throws Exception{
Job job = new Job();
job.setJarByClass(MTjoin.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true)?0:1);
}
}