Моя первая мысль - сделать что-то вроде этого:
MAP: использовать какое-нибудь фиктивное значение в качестве ключа, возможно, пустую строку для эффективности, и создать класс, который будет содержать как зарплату, так и идентификатор сотрудника.В каждом Mapper создайте массив, который содержит 10 элементов.Заполните его первыми десятью зарплатами, которые вы видите, отсортированными (таким образом, местоположение 0 - самая высокая зарплата, местоположение 9 - 10-е самое высокое).Для каждой зарплаты после этого, посмотрите, входит ли она в первую десятку, и, если она есть, вставьте ее в правильное место, а затем, при необходимости, переместите более низкую зарплату вниз.
Combiner / Reducer: объединить сортировать списки.Я бы сделал то же самое, что и в mapper, создав массив из десяти элементов, а затем перебрал все массивы, соответствующие ключу, объединив их в соответствии с той же последовательностью сравнения / замены / перемещения вниз, что и в mapper * 1005.*
Если вы запускаете это с одним редуктором, это должно обеспечить вывод 10 самых высоких зарплат.
Я не вижу способа сделать это при использовании более одного редуктора.Если вы используете комбинатор, тогда редуктор должен объединять массив из десяти элементов только для каждого узла, на котором выполнялись мапперы (который должен быть управляемым, если вы не работаете на тысячах узлов).