排骨学长(\t) 2022-12-26 16:26 采纳率: 43.5%
浏览 74
已结题

为什么reduce阶段遍历value打印是“D@67d73bd8,[D@67d73bd8”

为什么reduce阶段遍历value打印是“D@67d73bd8,[D@67d73bd8”
不管怎么样转都是这个,
map阶段输出前打印还是 -5,-5
到reduce阶段遍历就变成了 [D@67d73bd8,[D@67d73bd8
reduce遍历代码如下

static class K_meansReducer extends Reducer<Text, Text, Text, NullWritable>{
        Counter counter = null;
        @Override
        protected void reduce(Text key, Iterable<Text> values,Context context)
                throws IOException, InterruptedException {
            int len = key.toString().split(",").length;
            double newCenter[] = new double[len]; //保存新生成的簇中心
            int size = 0; //记录传过来的簇中有多少向量
            for(Text value : values){
                String[] centerStr = value.toString().split(",");//拿到所有d维空间中的“点”信息
                for(int i=0;i<centerStr.length;i++){//将其对应的空间轴坐标累加,方便后面求均值
                    newCenter[i] += Double.parseDouble(centerStr[i]);
                }
                size++;
            }

img

  • 写回答

4条回答 默认 最新

  • 冷月半明 2022-12-26 17:29
    关注

    在Map阶段输出的内容是 "-5,-5",而在Reduce阶段输出的内容是 "[D@67d73bd8,[D@67d73bd8"。

    这是因为,在Map阶段,输出的是字符串,而在Reduce阶段,输出的是对象。在Java中,如果直接调用对象的toString方法,会输出该对象的内存地址,而不是对象的属性值。因此,在Reduce阶段输出的结果中,看到的是对象的内存地址。

    要想正确输出对象的属性值,需要在对象中重写toString方法,使其能够正确输出对象的属性值。

    例如,如果你的对象中有一个名为 "value" 的属性,那么可以这样重写toString方法:

    public String toString(){
        return this.value;
    }
    
    
    

    这样,在调用对象的toString方法时,就会输出 "value" 属性的值。

    希望这些信息能帮助你解决问题。如果你还有任何疑问,欢迎继续提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月29日
  • 已采纳回答 12月29日
  • 创建了问题 12月26日