分享

reduce函数感觉有问题,取输入的value值的问题,怎么都想不明白,求问

heelo 发表于 2017-9-14 21:13:29 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 12 9682

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
    for(Text k:values){
        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
    }
    System.out.println(l.get(0));
    System.out.println(l.get(1));如上,问题出来了,打印了列表的0和1元素,但是是相等的,请问这是什么原因啊,泪目,求解答


已有(12)人评论

跳转到指定楼层
heelo 发表于 2017-9-14 21:14:12
存入list的两个值是不相等的
回复

使用道具 举报

desehawk 发表于 2017-9-14 21:51:22
本帖最后由 desehawk 于 2017-9-14 22:03 编辑
heelo 发表于 2017-9-14 21:14
存入list的两个值是不相等的

没有报错已经不错了。
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
    for(Text k:values){
        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
    }
上面代码可能在多台机器执行。
输出语句也可能在多台,但是可能并不是同一台。
    System.out.println(l.get(0));
    System.out.println(l.get(1));

回复

使用道具 举报

langke93 发表于 2017-9-14 22:05:46
改成下面试试
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
    for(Text k:values){

        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
int i=0;
System.out.println(l.get(i));
i++;


    }


回复

使用道具 举报

heelo 发表于 2017-9-14 22:05:54
desehawk 发表于 2017-9-14 21:51
没有报错已经不错了。
public void reduce(Text key, Iterable values, Context context) throws IOExce ...


只有一台机器啊,而且reduce任务数也只有一个
回复

使用道具 举报

heelo 发表于 2017-9-14 22:07:50
langke93 发表于 2017-9-14 22:05
改成下面试试
public void reduce(Text key, Iterable values, Context context) throws IOException, Int ...


好的,谢谢
回复

使用道具 举报

sstutu 发表于 2017-9-15 09:08:29

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
int i=0;
    for(Text k:values){

        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
System.out.println(l.get(i));
i++;


    }

应该这个。
回复

使用道具 举报

heelo 发表于 2017-9-15 10:10:40
sstutu 发表于 2017-9-15 09:08
public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedExce ...


用你这个可以了,不过还是不太明白,这个是什么原因啊,想请教一下
回复

使用道具 举报

sstutu 发表于 2017-9-15 13:10:39
heelo 发表于 2017-9-15 10:10
用你这个可以了,不过还是不太明白,这个是什么原因啊,想请教一下

这跟应用程序域有关系。
由于reduce被分分发到不同的机器
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
    for(Text k:values){
        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
    }
下面跟reduce不在同一个域中。
    System.out.println(l.get(0));
    System.out.println(l.get(1));


所以会造成取不到数据。


public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    System.out.println("the key is "+key); //打印当前的key值
    List<Text> l = new ArrayList<Text>(); //列表保存value值
int i=0;
    for(Text k:values){

        System.out.println(k.toString()); //打印出value中的值并保存,通过打印可知该key中有两个不同的value值
        l.add(k);
System.out.println(l.get(i));
i++;


    }
如果放到reduce中,都在同一个域中了,所以能够取到。
回复

使用道具 举报

heelo 发表于 2017-9-15 20:44:54

已经解决了

本帖最后由 heelo 于 2017-9-15 21:11 编辑

已经解决问题了,见下楼
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条