Как вычесть в парадигме Map Reduce

У меня есть следующий набор данных

s1, s2, count
1, 2, x1
1, 3, x2
1, 4, x3
2, 1, y1
2, 3, y2
2, 4, y3
3, 1, z1
3, 2, z2

Я хочу получить следующий вывод

s1, s2, count
1, 2, x1-y1
1, 3, x2-z1
1, 4, x3
2, 3, y2-z2
2, 4, y3

Идея состоит в том, что s1 является объектом, который предпочтительнее s2. И у меня есть кортежи такие, что s1 (скажем = 1) был предпочтительнее s2 (скажем = 2) в x1 раз И s1 (скажем = 2) был предпочтительнее s2 (скажем = 1) в y1 раз. Что мне нужно, так это алгоритм sub O(n^2) для вычисления абсолютного числа раз, когда s1 был предпочтительнее s2 (или наоборот). (X1-y1),

Проблема в том, что существует 230 миллионов таких кортежей, и у меня не может быть алгоритма O (n ^ 2) для его вычисления.

Одно наблюдение состоит в том, что кортежи сортируются на s1, поскольку они являются результатами другого вывода MR.

Пожалуйста, помогите мне найти лучшее решение.

1 ответ

Я не уверен, что понимаю "благосклонность". Похоже, что вы хотите вычесть значения, где s1, s2 значения одинаковы.

Вы можете определить пользовательский Comparable / Writableдавайте назовем это S1S2Writableинкапсулирует (s1, s2) как кортеж и утверждает, что два кортежа равны, когда

((tuple1.s1 == tuple2.s1 && tuple2.s1 == tuple2.s2) ||
    (tuple1.s1 == tuple2.s2 && tuple2.s2 == tuple2.s1))

С этим вы можете определить процесс, используя Mapper<S1S2Writable, IntWritable, S1S2Writable, IntWritable> чтобы прочитать ваш входной файл и передать его Reducer<S1S2Writable, IntWritable, KEYOUT, IntWritable>,

Это сгруппирует S1S2Writable с Iterable<IntWritable>, из которого вы можете выполнить вычитание.

Другие вопросы по тегам