为什么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++;
}
在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的代码。