我是靠谱客的博主 独特高跟鞋,最近开发中收集的这篇文章主要介绍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<IntWritable, Text, Text, Text> {
static List<String> list = new ArrayList<>();
static String[] arr = new String[16];
@Override
protected void reduce(IntWritable key, Iterable<Text> 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<LongWritable, Text, IntWritable, Text> {
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<String> list = new ArrayList<>();
public static List<String> xunhuan(int node, String[] arr) {
StringBuffer names = new StringBuffer();
List<String> list2 = new ArrayList<>();
List<String> 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面试题---空箱、冰调、洗衣机系列(不走寻常路系列)的全部内容,希望文章能够帮你解决MapReduce面试题---空箱、冰调、洗衣机系列(不走寻常路系列)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部