在Mapper中的Object中转换Stringified MapWritable

时间:2016-11-17 06:39:06

标签: java hadoop machine-learning mapreduce

实际上我正在尝试实现一种机器学习算法,它要求我在文件中写入reducer的输出,然后在下一个映射器中读取该文件。问题是我正在编写在reducer中创建的MapWritable对象,但是现在当我想访问它只是字符串的对象时。有没有办法在读取文件时将此对象org.apache.hadoop.io.MapWritable@72d01691转换为实际的MapWritable对象?

我在mapper中的部分代码:

DoubleWritable[][] Tdata = new DoubleWritable[T.numRows()][T.numColumns()];
for (int k = 0; k < Tdata.length; k++) {
    for (int j = 0; j < Tdata[k].length; j++) {
        Tdata[k][j] = new DoubleWritable(T.get(k, j));
    }
}
DoubleArrayWritable t = new DoubleArrayWritable();
t.set(Tdata);

DoubleWritable[][] Hdata = new DoubleWritable[H.numRows()][H.numColumns()];
for (int k = 0; k < Hdata.length; k++) {
    for (int j = 0; j < Hdata[k].length; j++) {
        Hdata[k][j] = new DoubleWritable(H.get(k, j));
    }
}
DoubleArrayWritable h = new DoubleArrayWritable();
h.set(Hdata);

mw.put(new IntWritable(0), h);
mw.put(new IntWritable(1), t);
context.write(new Text(splitId), mw);

在javascript中我们使用eval这样的东西有没有这样的快捷方式?

1 个答案:

答案 0 :(得分:0)

您可能正在使用TextOutputFormat写出数据,这是默认设置,或者您可能已将其设置为。

要正确获取实际对象,您应该使用SequenceFileOutputFormat编写输出,并在下一个作业中使用SequenceFileInputFormat读取。

您可以使用以下内容设置输入/输出格式:

job.setInputFormat(SequenceFileInputFormat.class);
job.setOutputFormat(SequenceFileOutputFormat.class);

在接收映射器中,您需要设置传入对象以匹配前一个reducer输出的类型。