使用hadoop计算直方图

computing histogram using hadoop

我有一个整数 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. 在映射器中首先解析输入以识别通道。

  2. 以通道为键(r,g,b,a),以量级为值。在您的示例中:(r, 1), (g,2)... (a,4)。

    1. 在 reducer 中创建长度为 255 的数组(每个通道一个)并用零初始化。

    2. 对于每个输入,将与幅度相关的单元格递增一(在适当的数组中)

    3. 在输出中写入每个数组的值。在reducer的cleanup方法中

如果您使用 4 个 reducer 并创建一个分区器将每个通道发送到不同的 reducer,那么在每个 reducer 中您只需要创建一个数组,并且在输出中您将在不同的文件中获得每个直方图。而不是使用通道的字母,您可以将它们编码为 1,2,3,4 并使用 select reducer 的键。或者只使用一个减速器,你需要生成四个数组或一个 4 X 255 矩阵,并将 4 个直方图写入唯一文件。