【问题标题】:Emitting column data from reducer as a row从 reducer 中将列数据作为一行发送
【发布时间】:2014-03-03 05:28:05
【问题描述】:

我正在尝试处理一个 csv 文件。 In map() 我将把每一列作为一个值发送给reducer。 In reducer我将找到最小值和最大值并进一步处理。处理后我需要上下文。写入值。但尝试以特定方式输出。

在 reducer 中,我正在处理每一列,但我需要输出整个 row 即 col1 的值,col2 的值,col3 的值,col4 的值。

reducer处理后的样本数据

in reducer
0.62
0.38
0.9
in reducer
0.24
0.59
0.1
in reducer
0.5
1.0
0.2
in reducer
0.0
0.0
0.3

预期输出

 0.62,0.24,0.5,0.5
 0.38,0.59,1.0,0.0
 0.9,0.1,0.2,0.3

是否可以在reducer中为每次迭代处理每个不同的键

key1value1,key2value1,key3value1
key1value2,key2value2,key3value2

任何建议

【问题讨论】:

  • 为 max 和 min 编写 2 个不同的 reducer,并将两个 reducer 结果合并到一个文件中
  • @Alkesh_IT:不,它不是 min 和 max 的输出。在 min 和 max 之后,我也应用了一些方程。之后我得到了上述结果。我需要结合该结果跨度>
  • 有什么方法可以在一个 tym 访问 Reducer 中的不同键并将每个键值作为一行发出?
  • 不知道,但可能因为记录分区而无法实现。

标签: java hadoop mapreduce reducers


【解决方案1】:

使用 MapReduce 链接可以执行此操作

使用文本类型在单行中写入减速器输出 喜欢

0.62,0.38,0.9
0.24,0.59,0.1

并再次对第一个 MapReduce 的输出文件执行 mapreduce。

public void map(Text key, Text value,OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
  String temp=new String(value);
  String token[]=temp.split(",");
  output.collect(new Text("max"),new text(token[0]));
  output.collect(new Text("min"),new text(token[1]));
  output.collect(new Text("result"),new text(token[2]));
}

public void reduce(Text key, Iterator<Text> values,
    OutputCollector<Text, Text> output, Reporter reporter)
    throws IOException {
StringBuffer sb=new StringBuffer();
while (values.hasNext())
   sb.append(values.next().toString() + ",");
output.collect(new Text(""),new Text(sb.toString()))



}

【讨论】:

  • 但是这个输出与我的预期不同。我试图得到输出为 0.62,0.24,0.5,0.5 \n 0.38,0.59,1.0,0.0 \n 0.9,0.1,0.2,0.3 \ n
  • 但是这里第 1 行是 key 1,第 2 行是 key 2 如何得到它的 transpose.ie key1,key2 \nkey1,key2
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多