为什么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 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//将其对应的空间轴坐标累加,方便后面求均值
                    newCenter[i] += Double.parseDouble(centerStr[i]);
                }
                size++;
            }

img

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

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

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

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

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


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

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

你的Text类有重写toString么,没有的话默认调用的是object的tostring输出的是对象地址。可能获取这个输入值不能用tostring方法

需要看一下你的Mapper的代码。