我有以下数据集

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倍。我需要的是一个子O(n ^ 2)算法,以计算s1比s2(或其他方式)受青睐的绝对次数。 (x1-y1)

问题是有2.3亿个这样的元组,而我没有O(n ^ 2)算法来计算它。

一个观察结果是,元组在s1上排序,因为它们是另一个MR输出的结果。

请帮助我找到更好的解决方案。

最佳答案

我不确定我是否了解“好处”。好像您要减去s1s2值相同的值。

您可以定义一个自定义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>

这会将S1S2WritableIterable<IntWritable>组合在一起,您可以对其进行减法运算。

关于hadoop - 如何在Map Reduce范式中进行减法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46936671/

10-11 11:02