我有一个 Java MR 程序。我的 Map 方法的输出是各种字符串/数字,我现在将其放入字符串中。在Reduce 中,我分割字符串并使用参数。现在我想知道这是否不能更容易地完成。
我正在考虑一个映射,其中我将字符串/数字存储为值,并使用描述每个值的命名键。那么这个 Map 将是我的“Value Out”(MapOutputValueClass)。
这可能吗?当我在文档中读到此内容时,我想我的想法无法实现:
键和值类必须可由框架序列化,因此需要实现 Writable 接口(interface)。此外,关键类必须实现 WritableComparable 接口(interface),以方便框架进行排序。
那么您建议我为 MapOutputValueClass 选择什么? :-) 也许拿一个 Map 并将其转换为 ImmutableBytesWritable ?我也不想减慢我的程序...
感谢您的解答!
最佳答案
您可以使用各种字符串/数字编写自己的类。例如,并将其作为映射器的输出值类和 reducer 的输入值类传递。
Class Foo{
String A;
String B;
int c, d;
....
}
在你的映射器中:
public class MyMapper extends Mapper<Text, Text, Text, Foo>{
....
}
在你的 reducer 中:
public class MyReducer extends Reducer<Text, Foo, Text, LongWritable>{
...
}
在你的驱动程序中:
设置映射器输出值类:
job.setMapOutputValueClass(Foo.class);
记住当你 extends
Mapper
,需要填写的类按如下顺序:<KEYIN_CLASS, VALUEIN_CLASS, KEYOUT_CLASS, VALUEOUT_CLASS>
,Reducer
也是如此
关于java - Hadoop MapReduce : MapOutputValueClass : Map<String, 字符串>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11046619/