mapreduce 去重的问题怎么解决? [问题点数:40分]
不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主
收藏
楼主
发表于: 2014-06-14 19:05:47
john 89
tom 100 mary 100 mary 200 tom 20 ———– 我刚学mapreduce,正在练习,上面这个我计算了很久也不对,就是对第一列去重,去重后应该是3 如果用mapreduce计算成功后,part-00000 的文件内容 是: 3 请问下,这个mapreduce怎么写啊? | |
6
|
#1 得分:0
回复于: 2014-06-15 10:03:12
map按第一列为key,value无所谓
reduce class中初始化一个计数器 每个reduce方法中计数器每次加一 reduce 的cleanup方法中commit计数器就可以了 |
|
#2 得分:0
回复于: 2014-06-15 21:40:54
map 知道怎么写了,那reduce的具体怎么写啊?
| |
|
|
#3 得分:0
回复于: 2014-06-18 10:37:48
直接一个Map,在Map里面定义一个全局的HashSet,map方法里面把key加入进去,cleanup方法里面把结果写入就行了。
|
|
#4 得分:0
回复于: 2014-06-18 15:18:45
学习
|
6
|
#5 得分:0
回复于: 2014-06-18 17:35:41
引用 3 楼 wulinshishen 的回复:
直接一个Map,在Map里面定义一个全局的HashSet,map方法里面把key加入进去,cleanup方法里面把结果写入就行了。 只用map不可能解决这个问题 如果在不同的map中都用同一个key,怎么解决? 必须用reduce去group后的key才能得到去重效果 |
|
#6 得分:0
回复于: 2014-06-19 09:43:31
引用 5 楼 tntzbzc 的回复:
Quote: 引用 3 楼 wulinshishen 的回复:直接一个Map,在Map里面定义一个全局的HashSet,map方法里面把key加入进去,cleanup方法里面把结果写入就行了。 嗯,对,没想那么仔细,谢谢指正。 |
#7 得分:0
回复于: 2014-06-20 15:16:20
引用 4 楼 tjytad1982 的回复:
学习 public static class Map extends Mapper<LongWritable, Text, Text, Text> { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); try { String[] lineSplit = line.split("\t"); context.write(new Text(lineSplit[0]), new Text("")); } catch (java.lang.ArrayIndexOutOfBoundsException e) { context.getCounter(Counter.LINESKIP).increment(1); return; } } } public static class Reduce extends Reducer<Text, Text, Text, Text> { private Set<String> count = new HashSet<String>(); public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { for(Text value:values){ count.add(value.toString()); } context.write(key, new Text("")); } } ------------------------- 这个问题纠结我2周了,这个方面的学习资料太少了,我的map和reduce是这样写的,但是数据量大一些,就会内存溢出,我想我这个思路是错误的 你说的 “必须用reduce去group后的key才能得到去重效果 ”,这个 map和reduce是具体怎么写的啊? | |
#8 得分:0
回复于: 2014-06-20 15:22:52
引用 7 楼 wzl189 的回复:
Quote: 引用 4 楼 tjytad1982 的回复:-------------刚才写的mapreduce错了,以这个为准学习 | |
#9 得分:0
回复于: 2014-06-20 15:33:13
引用 1 楼 tntzbzc 的回复:
map按第一列为key,value无所谓 谢谢了,请教下,你说的这个map我知道怎么写了,但是这个reduce怎么写啊? | |
6
|
#10 得分:0
回复于: 2014-06-20 17:30:04
我晚点写个完整例子给你
|
6
|
#11 得分:0
回复于: 2014-06-20 20:47:41
reduce阶段只用一个计数器就行了 | ||
#12 得分:0
回复于: 2014-06-20 22:45:45
引用 11 楼 tntzbzc 的回复:
太感谢了,你了解这么多啊,我都搞了2周,没有结果,想再请教最后一个问题: 假如 第一列是姓名,第二列是班级(先不管我这个需求是否合理) john 100 john 100 mary 100 mary 200 tom 200 想统计处如下结果,就是按班级人数去重 100 2 200 2 这个mapreduce怎么写啊? 望高手最后再解答下,万分感谢了。 | |||
6
|
#13 得分:0
回复于: 2014-06-21 11:41:41
map 输出key 用 班级 + 分隔符 + 姓名
重写 grouping 实现二次排序,如果reduce num > 1 还需要重写 partition reduce略作修改,增个姓名变量 ,比较当前姓名是否和前一个姓名是否一致,如果不一致 计数器+=1 代码就不贴了,LZ多思考一下,这种简单的MR不难解决 |
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分 你还可以输入10000个字符(Ctrl+Enter)
- 请遵守CSDN用户行为准则,不得违反国家法律法规。
- 转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。