我正在使用map-reduce框架。
假设这是输入列表 [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P ,Q, R, S, T, U, V, W, X, Y, Z]
我的Map器生成以下输出:
<"Key 1" : A>
<"Key 2" : B>
<"Key 3" : C>
<"Key 1" : D>
<"Key 2" : E>
<"Key 3" : F>
<"Key 1" : G>
<"Key 2" : H>
<"Key 3" : I>
<"Key 1" : J>
<"Key 2" : K>
<"Key 3" : L>
<"Key 1" : M>
<"Key 2" : N>
<"Key 3" : O>
<"Key 1" : P>
<"Key 2" : Q>
<"Key 3" : R>
<"Key 1" : S>
<"Key 2" : T>
<"Key 3" : U>
<"Key 1" : V>
<"Key 2" : W>
<"Key 3" : X>
<"Key 1" : Y>
<"Key 2" : Z>
现在减速机的输出通常是这样的:
<"Key 1" : A, D, G, J, M, P, S, V, Y>
<"Key 2" : B, E, H, K, N, Q, T, W, Z>
<"Key 3" : C, F, I, L, O, R, U, X>
但我想做的是这样的:
我想将每个键的输出合并成3块,然后生成最终的输出。
所以我希望我的减速机输出像这样:
<"Key 1" : [A, D, G], [J, M, P], [S, V, Y]>
<"Key 2" : [B, E, H], [K, N, Q], [T, W, Z]>
<"Key 3" : [C, F, I], [L, O, R], [U, X]>
任何帮助将不胜感激,因为我在这个问题上停留了两天。我无法理解最后一部分,即如何将输出分组为3块。
p、 如果块大小小于3(如最后一个键的示例),则可以,但不应超过3。
2条答案
按热度按时间ogq8wdun1#
是的,在您的案例中,您可以使用arraywritable作为reducer值类将值编写为固定大小的块。
你能做的是,
在reducer类中维护一个大小固定为3的示例数组列表变量。
在reduce()中,遍历给定键的值列表,并将其添加到数组列表中。
如果数组列表的大小达到3,则只需将其转换为
arraywritable示例,并将其传递给write()键,然后重置数组列表。
在作业中将outformat值类声明为arraywritable
配置。
b5lpy0ml2#
我认为,这很简单:
在减速机中,每次只需将3个值放入for循环。
用您选择的分隔符连接这三个并写入上下文
context.write(键、值)
请注意,您可以根据需要多次写入上下文,即对于3个输出的每个块,只需写入上下文,然后取下一组3个值。
如果你觉得有什么困难,请告诉我。
一个更复杂的解决方案是使用多输出。你甚至可以用这个写不同的文件。
使用hadoop1.0.2就是一个很好的例子
下面是来自javadocs的示例: