例如,以下是.csv中的一些输入数据:

  • url1一个
  • 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一个
  • 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);
    }
    }
    

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

    最佳答案

    不能保证值的顺序。

    如果要按某种顺序对它们进行排序,则需要将所有迭代器值添加到Arraylist中,然后根据需要使用自定义Comparator在其上调用Collections.sort

    然后在list.size() - 1处获取元素

    另外,根据您的问题,您输入的内容不包含逗号,因此请确保您使用的字符正确。

    09-11 11:46