Java 如何使用多路输出<;键入输出、值输出>;用于将输出数据写入多个输出
我是Hadoop和MapReduce的新手,一直在尝试根据键将输出写入多个文件。请任何人提供关于如何使用它的清晰想法或Java代码片段示例。我的映射器工作得非常好,经过洗牌后,关键点和相应的值按预期获得。谢谢 我试图做的是只将输入文件中的几条记录输出到一个新文件中。 因此,新的输出文件应仅包含那些必需的记录,而忽略其余无关的记录。 即使我不使用MultipleTextOutputFormat,这也可以正常工作。 我在mapper中实现的逻辑如下:Java 如何使用多路输出<;键入输出、值输出>;用于将输出数据写入多个输出,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我是Hadoop和MapReduce的新手,一直在尝试根据键将输出写入多个文件。请任何人提供关于如何使用它的清晰想法或Java代码片段示例。我的映射器工作得非常好,经过洗牌后,关键点和相应的值按预期获得。谢谢 我试图做的是只将输入文件中的几条记录输出到一个新文件中。 因此,新的输出文件应仅包含那些必需的记录,而忽略其余无关的记录。 即使我不使用MultipleTextOutputFormat,这也可以正常工作。 我在mapper中实现的逻辑如下: public static class Map
public static class MapClass extends
Mapper {
StringBuilder emitValue = null;
StringBuilder emitKey = null;
Text kword = new Text();
Text vword = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String[] parts;
String line = value.toString();
parts = line.split(" ");
kword.set(parts[4].toString());
vword.set(line.toString());
context.write(kword, vword);
}
}
公共静态类MapClass扩展
制图员{
StringBuilder-emitValue=null;
StringBuilder emitKey=null;
Text kword=新文本();
Text vword=新文本();
公共void映射(可长写键、文本值、上下文)
抛出IOException、InterruptedException{
字符串[]部分;
字符串行=value.toString();
零件=直线分割(“”);
set(parts[4].toString());
set(line.toString());
上下文。编写(kword,vword);
}
}
要减少的输入如下:[key1]-->[value1,value2,…]
[key2]-->[value1,value2,…]
[key3]-->[value1,value2,…]等
我感兴趣的是[key2]-->[value1,value2,…]忽略其他键和相应的值。请帮我解决这个问题。使用
多路输出
可以在多个文件中发出记录,但只能在一组预定义数量/类型的文件中发出,而不能在任意数量的文件中发出,并且不能根据键/值即时决定文件名
您可以通过扩展org.apache.hadoop.mapred.lib.MultipleTextOutputFormat
来创建自己的OutputFormat。OutputFormat类应能够根据reducer发出的键/值决定输出文件名和文件夹。这可以通过以下方式实现:
package oddjob.hadoop;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
public class MultipleTextOutputFormatByKey extends MultipleTextOutputFormat<Text, Text> {
/**
* Use they key as part of the path for the final output file.
*/
@Override
protected String generateFileNameForKeyValue(Text key, Text value, String leaf) {
return new Path(key.toString(), leaf).toString();
}
/**
* When actually writing the data, discard the key since it is already in
* the file path.
*/
@Override
protected Text generateActualKey(Text key, Text value) {
return null;
}
}
package oddjob.hadoop;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
公共类MultipleTextOutputFormatByKey扩展了MultipleTextOutputFormat{
/**
*使用它们键作为最终输出文件路径的一部分。
*/
@凌驾
受保护的字符串generateFileNameForKeyValue(文本键、文本值、字符串叶){
返回新路径(key.toString(),leaf.toString();
}
/**
*在实际写入数据时,放弃密钥,因为它已经在
*文件路径。
*/
@凌驾
受保护的文本generateActualKey(文本键、文本值){
返回null;
}
}
欲了解更多信息,请阅读
PS:您需要使用旧的
mapred
API来实现这一点。与较新的API一样,还不支持MultipleTextOutput
!请参阅。你好,阿马尔,非常感谢!!我期待着在新的API中实现同样的功能。那么,在较新的API中还有其他替代方案吗?我一直在尝试使用这样的东西,你能给我一些建议吗?谢谢。为什么不能使用旧的API?我想对于这种特殊情况,您应该使用旧的API。正如您在另一个问题的链接中所看到的,我在回答中提到,它还没有为新的API实现。请检查这个问题:使用旧的API。将代码转换为使用旧API应该不难。使用它没有害处。