在MapReduce中过滤/排除列

时间:2014-05-11 14:40:54

标签: design-patterns hadoop mapreduce filtering

我想知道实施M / R过滤器的最佳做法是什么,它将执行以下操作:

我们说有一个关键值对:

键:IntegerID,值:n个整数值。例如:

1 | 1 2 2 3 3 0 6

2 | 0 3 4 5 6 7 8

3 | 1 5 2 6 2 2 6

我想过滤(排除)包含' 0 '

的列

期望的输出:

1 | 2 2 3 3 6

2 | 3 4 5 6 8

3 | 5 2 6 2 6

由于

1 个答案:

答案 0 :(得分:3)

它看起来不适合M / R,因为减速器需要查看所有行的所有值以对列进行“决定”。

我很想知道实际问题是什么以及为什么你决定首先使用M / R..

如果我 在M / R中执行此操作

我让映射器将每一行分成一个([col#,rowkey],value)对 - col#是这样一列中的所有数据都会在一个reducer中结束(谁可以决定是否放弃列或不)。 row_id将用于将所有Reducer的结果组合回单行。

例如,示例中的第一行将从mapper发送到reducer:

([0,1],1)

([1,1],2)

([2,1],2)

([3,1],3)

([4,1],3)

([5,1],0)

([6,1],6)

然后你需要一个分区器,根据列号(即[col#,rowkey])对的第一个元素,将map输出分区为reducer。还要编写自定义比较器,这样地图结果将到达按值排序的reducer。

这样,reducer只需要查看第一个值 - 如果是0,我们知道该列包含0,并且reducer可以在不做任何其他操作的情况下退出。 如果它不是0,它应该作为一个身份缩减器 - 只是按原样输出映射器的所有结果。

现在您需要第二个M / R作业以原始格式重新组合: 映射器不会做任何事情。 自定义分区程序会将具有相同rowkey的所有结果发送到同一个reducer。如果保留最终结果集中的行顺序很重要,则可以使用总订单分区程序。 自定义比较器将按rowkey和col#对每个分区中的数据进行排序。

reducer将在同一个字符串中逐个写入同一行的所有值,然后将其作为一行输出。

相关问题