Java 如何使用多路输出<;键入输出、值输出>;用于将输出数据写入多个输出

Java 如何使用多路输出<;键入输出、值输出>;用于将输出数据写入多个输出,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我是Hadoop和MapReduce的新手,一直在尝试根据键将输出写入多个文件。请任何人提供关于如何使用它的清晰想法或Java代码片段示例。我的映射器工作得非常好,经过洗牌后,关键点和相应的值按预期获得。谢谢 我试图做的是只将输入文件中的几条记录输出到一个新文件中。 因此,新的输出文件应仅包含那些必需的记录,而忽略其余无关的记录。 即使我不使用MultipleTextOutputFormat,这也可以正常工作。 我在mapper中实现的逻辑如下: public static class Map

我是Hadoop和MapReduce的新手,一直在尝试根据键将输出写入多个文件。请任何人提供关于如何使用它的清晰想法或Java代码片段示例。我的映射器工作得非常好,经过洗牌后,关键点和相应的值按预期获得。谢谢

我试图做的是只将输入文件中的几条记录输出到一个新文件中。 因此,新的输出文件应仅包含那些必需的记录,而忽略其余无关的记录。 即使我不使用MultipleTextOutputFormat,这也可以正常工作。 我在mapper中实现的逻辑如下:

 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应该不难。使用它没有害处。