В hadoop, как получить последний элемент в значениях - PullRequest
0 голосов
/ 27 мая 2018

Вот некоторые входные данные в .csv, например:

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

и что яхочу:

  • url1 ч
  • 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]));
}
}

и функция Reduce:

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 голосов
/ 27 мая 2018

Порядок значений не гарантируется.

Если вы хотите отсортировать их по какому-либо порядку, вам нужно добавить все значения итератора в Arraylist, а затем вызвать Collections.sort для него с помощью пользовательского компаратора, если хотите.

Затем получите элемент в list.size() - 1


Кроме того, ваш ввод не содержит запятых в соответствии с вашим вопросом, поэтому убедитесь, что вы разделяете на правильный символ.

...