我有一个整数的csv文件,它为一个图像编码(r,g,b,a)值,我想为r,g,b和a中的每一个计算4个直方图。我可以在hadoop中编写一个map reduce作业来完成这个任务吗?
例如给定的输入文件:
1,2,3,4,1,2,3,4
我希望直方图输出为:
r[1] = 2 r[i] = 0 for all other i's
g[2] = 2 g[i] = 0 for all other i's
b[3] = 2 b[i] = 0 for all other i's
a[4] = 2 a[i] = 0 for all other i's
实际输出文件是另一个csv文件,其外观如下:
0, 2, (253 0's for red), 0, 0, 2, (252 0's for green), 0, 0, 2, (251 0's for blue), 0, 0, 0, 0, 2, (250 0's for alpha)
1条答案
按热度按时间iugsix8n1#
当然可以。
在Map程序中,首先解析输入以标识通道。
使用通道作为键(r、g、b、a),使用幅值作为值。在你的例子中:(r,1),(g,2)(a、 (第4节)。
在reducer中,创建长度为255(每个通道一个)的数组,并用零初始化。
对于每个输入,在一个(在适当的数组中)中增加与幅值相关的单元格
在输出中写入每个数组的值。在减速器的清理方法中。
如果您使用4个reducer并创建一个分区器,将每个通道发送到不同的reducer,那么在每个reducer中您只需要创建一个数组,并且在输出中您将在不同的文件中获得每个直方图。相反,要使用通道的字母,可以将它们编码为1、2、3、4,并使用键选择减速机。或者只使用一个减速机,其中您将需要生成四个数组或一个4 x 255矩阵,并只在文件中写入4个直方图。