如何在Map Reduce范例中减去

时间:2017-10-25 15:40:57

标签: hadoop mapreduce distributed-computing emr elastic-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次。我需要的是一个子O(n ^ 2)算法来计算s1优于s2(或其他方式)的绝对次数。 (x1-y1)

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

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

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

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解"赞成。"看起来好像要减去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>分组,您可以执行减法操作。