【问题标题】:issue with Array output value (HADOOP)数组输出值问题 (HADOOP)
【发布时间】:2013-04-27 12:00:50
【问题描述】:

我的 Mapper 代码中有这个,其中 'a' 是一个 DoubleWritable 数组。

DoubleArrayWritable ad = new DoubleArrayWritable();
ad.set(a);
int row_id1=(int)row_id;
context.write(new LongWritable(row_id1),new Text(ad.toString()));

我只是将这些输入打印到 reducer 作为 reducer 的输出,我将其作为 reducer 的输出,

1   DoubleArrayWritable@e29820
2   DoubleArrayWritable@718242
3   DoubleArrayWritable@1ec58a
4   DoubleArrayWritable@3afb99

我错过了什么?我想输出为

 1  2 3 4 7
 2  4 6 5 9
 3  4 5 7 3  

【问题讨论】:

    标签: map hadoop mapreduce


    【解决方案1】:

    对于DoubleArrayWritable 类,我假设您使用的是this question 接受答案中的代码。如果是这种情况,您需要实现 toString 以您想要的格式输出。可能是这样的:

    public String toString() {
        if (data.length == 0) {
          return "";
        }
    
        StringBuilder sb = new StringBuilder();
        for (double d : data) {
            sb.append(d).append(" ");
        }
    
        //trim the trailing space
        sb.setLength(sb.length - 1);
        return sb.toString();
    }
    

    如果你能接受这样的格式:

    [1, 2, 3, 4]

    您可以跳过toString 方法并改为执行此操作:

    context.write(new LongWritable(row_id1),new Text(Arrays.toString(ad.getData())));
    

    【讨论】:

    • 谢谢我喜欢...现在你能告诉我如何从一个单独的文件中获取一些先前的数据,我可以用它来处理我在 reducer 中的输入数据。就像我存储了一些总和在一个或多个文件中,现在我想将我从减速器中的映射器获得的每个输入除以该总和。 (我是HADOOP的新手,请尝试相应地回答)。
    【解决方案2】:

    你也可以试试:

    context.write(new LongWritable(row_id1),new Text(String.valueOf(ad)));
    

    我将它用于字符串到文本的转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多