package com.testMr;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
public class LeftJoinDemo {
public static class LeftJoinMap extends Mapper<LongWritable, Text, Text, Text> {
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
String[] arr = value.toString().split(" ");
FileSplit file = (FileSplit) context.getInputSplit();
String path = file.getPath().toString();
String buyer;
if (path.contains("trade.txt")) {
buyer = arr[2];
context.write(new Text(buyer), new Text(value.toString() + " " + "a"));
} else {
buyer = arr[1];
context.write(new Text(buyer), new Text(value.toString() + " " + "b"));
}
}
}
public static class LeftJoinReduce extends Reducer<Text, Text, Text, Text> {
@Override
protected void reduce(Text arg0, Iterable<Text> arg1, Reducer<Text, Text, Text, Text>.Context arg2)
throws IOException, InterruptedException {
List<String> a = new ArrayList<String>();
List<String> b = new ArrayList<String>();
List<String> result = new LinkedList<String>();
String[] arr = new String[] {};
String[] arr1 = new String[] {};
for (Text line : arg1) {
arr = line.toString().split(" ");
if (arr[arr.length - 1].equals("a")) {
a.add(line.toString());
} else {
b.add(line.toString());
}
}
if (a.size() != 0) {
for(String trade:a){
arr1 = trade.split(" ");
}
if (b.size() != 0) {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
Date now = dateFormat.parse("2015-08-02");
for (String order : b) {
arr = order.split(" ");
int price = Integer.parseInt(arr[3]);
date = dateFormat.parse(arr[4]);
if (price > 10 && date.before(now)) {
result.add(arr[0]);
}
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (result.contains(arr[0])) {
arg2.write(arg0, new Text(arr1[1] + " " + arr1[0] + " " +arr1[3]));
}
}
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException, Exception {
System.out.println(args.length);
for (String str : args) {
System.out.println(str);
}
String input1 = args[0];
String input2 = args[1];
String outputPath = args[2];
Job job = Job.getInstance();
job.setJobName("test");
job.setJarByClass(LeftJoinDemo.class);
FileInputFormat.addInputPath(job, new Path(input1));
FileInputFormat.addInputPath(job, new Path(input2));
FileOutputFormat.setOutputPath(job, new Path(outputPath));
job.setMapperClass(LeftJoinMap.class);
job.setReducerClass(LeftJoinReduce.class);
job.setPartitionerClass(HashPartitioner.class);
job.setNumReduceTasks(1);
job.setOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
trade表訂單號 賣家 買家 買家城市
1 A 小王 北京
2 B 小李 天津
3 A 小劉 北京
order表 子訂單表
所屬訂單號 買家 商品名稱 價格 發貨時間
1 小王 電視 12 2015-08-01 09:08:31
1 小王 冰箱 24 2015-08-01 09:08:14
2 小李 空調 12 2015-09-02 09:01:31