MapReduce面试题---空箱、冰调、洗衣机系列(不走寻常路系列)

现有这些一些输入数据
1 0家电
2 0服装
3 0食品
4 1洗衣机
5 1冰箱
6 2男装
7 2女装
8 3零食
9 3水果
10 4美的
11 5海尔
12 6衬衫
13 7蓬蓬裙
14 8牛奶
15 14特仑苏

要求输出数据为(前面一栏是自己编号,后面一栏是父节点的编号,再后面是自己的名字)
家电  洗衣机 - 美的    
家电  冰箱 - 海尔     
服装  男装 - 衬衫
服装  女装 - 蓬蓬裙
食品  零食 - 牛奶 - 特仑苏
食品  水果

解题思路千千万,比如多个MapReduce的串联(每次让一个mapreduce以先前的mapreduce运行结果文件作为输入),或者在此基础上代码复用(相当于循环,因为里面代码大部分可以重用)。但是!!!!我走了个不寻常的道路~~~~~不想码字----我要狼人去,先贴代码吧........

---------------------------------------------------------------------思路分割线------------------------------------------------------------------------------------

1、首先利用mapreduce map端拆分每行字段,以父类节点为key,以子类节点+子类名称作为value,发送到reduce端

2、reduce端做的处理是将构建一个数组,再将循环遍历value值,并将这些value拼接起来,中间以特定分隔符分割,一会儿好拆分。将每个key转成int类型,然后将key对应的value拼接值,放在数组下标为key的位置。怎么解释呢-----就是我之后想遍历这个数组(主要用来得到所有key,value),然后相当于每个位置上放的都是以这个下标节点key为父节点的子类。

3、现在用到递归,如果有子类,则子类再去找这个子类编号--------对应的arr[id]。如果没有子类了,则返回空串,具体怎么实现的,看代码吧。

本来我还很菜--------所以要是有什么问题,欢迎指导!!!!算法复杂度的话,我不知道怎么算,应该是N吧,或者知道的告诉我,谢谢~~~~~~~~

public class ProductReducer extends Reducer {
	static List list = new ArrayList<>();
	static String[] arr = new String[16];
	@Override
	protected void reduce(IntWritable key, Iterable values, Context context)
			throws IOException, InterruptedException {
		for (Text value : values) {
			if (arr[key.get()]==null)
				arr[key.get()] = value.toString();
			else
				arr[key.get()]=arr[key.get()]+"~"+value.toString();
//应该直接追加完才放在数组里的,不该这么频繁的调用----------------------------------------------------
//比如先找个stringbuffer来存,然后stringbuffer转string放到数组中去。
//或者不想直接设置一个长度固定的数组,那倒是也可以设一个map(忘了谁跟我说map性能不太好来着)
		}
	}

	public void done(Context context) throws IOException, InterruptedException{
		context.write(new Text("----------"), new Text("----------f"));
	}
	@Override
	protected void cleanup(Context context) throws IOException, InterruptedException {
		list = findrelation.xunhuan(0,arr);
		for (String li : list) {
			String[] split = li.split("——");
			context.write(new Text(split[0]),new Text(li.substring((split[0] + "——").length(), li.length())));
		}	
		super.cleanup(context);
	}
}
public class ProductMapper extends Mapper {
	
	String first=null;
	String father=null; 
	String name=null;
	@Override
	protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
		String[] products = value.toString().split("\t");
		if(products.length==3){	
		first= products[0];
		father= products[1];
		name= products[2];
		context.write(new IntWritable(Integer.valueOf(father)), new Text(first+","+name));	
		}	
	}
}
public class findrelation {
	static List list = new ArrayList<>();
	public static List xunhuan(int node, String[] arr) {
		StringBuffer names = new StringBuffer();
		List list2 = new ArrayList<>();
		List list3 = new ArrayList<>();
		if (null == arr[node]) {
			list2.add("");
			return list2;
		} else {
			String[] brr = arr[node].toString().split("~");
			for (int j = 0; j < brr.length; j++) {
				String[] crr = brr[j].split(",");
				names = new StringBuffer(crr[1]);
				for (String ll : xunhuan(Integer.valueOf(crr[0]), arr)) {
					if (ll.equals("")) {
						list3.add(names.append(ll).toString());
					} else {
						list3.add(names.append("——" + ll).toString());
					}
					names = new StringBuffer(crr[1]);
				}
			}
			return list3;
		}

	}
}

 

 

 

 

你可能感兴趣的:(MapReduce面试题---空箱、冰调、洗衣机系列(不走寻常路系列))