Вот лучший алгоритм, чем другие люди предложили:
#include <algorithm>
#include <vector>
template<class It> It unique2(It const begin, It const end)
{
It i = begin;
if (i != end)
{
It j = i;
for (++j; j != end; ++j)
{
if (*i != *j)
{ using std::swap; swap(*++i, *j); }
}
++i;
}
return i;
}
int main()
{
std::vector<std::string> v;
v.push_back("words");
v.push_back("words");
v.push_back("are");
v.push_back("fun");
v.push_back("words");
v.push_back("fun");
v.push_back("fun");
std::sort(v.begin(), v.end());
v.erase(v.begin(), unique2(v.begin(), v.end()));
std::sort(v.begin(), v.end());
v.erase(unique2(v.begin(), v.end()), v.end());
}
Это лучше, потому что для хранения требуется только swap
без вспомогательного vector
, что означает, что он будет вести себя оптимально для более ранних версиях C ++ и не требует, чтобы элементы были скопированы.
Если вы более умны, я думаю, вы также можете избежать сортировки вектора дважды.
Обычно в задании MapReduce картографы не записывают ни в один файл HDFS . Вместо этого они передают свои данные в IdentityReducer
, который затем записывает вывод в файл (или несколько файлов в случае нескольких редукторов).
Попробуйте установить в своем коде клиента:
//...
conf.setReducerClass(IdentityReducer.class);
conf.setNumReduceTasks(1);