billlee
2018-08-26 22:42:38 +08:00
这个并不是联合两行联合,而是需要预先知道所有 x, 比如 0 <= x < n.
让 mapper(x, f(x)) 产生 n 个输出:(x, i, f(x)), 0 <= i < n.
那么对于 x_a 和 x_b, x_a 产生的输出中有 (x_a, i, f(x_a), i = x_b, x_b 产生的输出中会有 (x_b, i, f(x_b)), i = x_a
如果我们把 (x, i) 视为 key, 那么 x_a 和 x_b 产生 key 就是 (x_a, x_b) 和 (x_b, x_a), value 是 f(x_a), f(x_b)
现在的问题是 (x_a, x_b) 和 (x_b, x_a) 的顺序是相反的,reducer 的时候没法汇聚到一起。这里需要做个小调整,在产生 key 是做个小变化,让 x 和 i 两个数中,小的那个放在前面,那么这两个 key 就是一样的了,reducer 的时候就能吧 f(x_a) 和 f(x_b) 汇聚到一起,算出 |f(x_a) - f(x_b)|.
建议你不要再花时间去搞 hadoop mapreducer 了,直接学 spark 吧。