我想知道实施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
由于
答案 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将在同一个字符串中逐个写入同一行的所有值,然后将其作为一行输出。