在hadoop中,如何获取值中的最后一个元素

时间:2018-05-27 08:40:30

标签: java hadoop mapreduce

这里有.csv中的一些输入数据,例如:

  • url1 a
  • url2 b
  • url3 c
  • url4 d
  • url5 e
  • url1 k
  • url1 h
  • url2 x
  • url5 m

我想要的是:

  • url1 h
  • url2 x
  • url3 c
  • url4 d
  • url5 m

输出, 但我得到的是:

  • url1 a
  • url2 b
  • url3 c
  • url4 d
  • url5 e

我不知道我的代码有什么问题,以及我的程序的一些代码:

功能图:

 public class MergeUrlMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
    String valueString = value.toString();
    String[] UrlHtmlData = valueString.split(",");
    output.collect(new Text(UrlHtmlData[0]), new Text(UrlHtmlData[1]));
}
}

和功能减少:

public class MergeUrlReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
public void reduce(Text t_key, Iterator<Text> values, OutputCollector<Text,Text> output, Reporter reporter) throws IOException {
    Text key = t_key;
    // if values is empty,then output will be (t_key,t_key)
    Text latestHtml = t_key;
    while (values.hasNext()) {
        Text temp = values.next();
        latestHtml = temp;
    }
    output.collect(key, latestHtml);
}
}

我的代码出了什么问题,输出应该是最后一个值,但实际上它是第一个值。提前谢谢!

1 个答案:

答案 0 :(得分:1)

不保证值的顺序。

如果你想根据某个顺序对它们进行排序,你需要将所有迭代器值添加到Arraylist中,然后使用自定义Comparator在其上调用Collections.sort,如果你愿意的话。

然后在list.size() - 1

获取元素

此外,根据您的问题,您的输入不包含逗号,因此请确保分割正确的字符。