您可以执行类似以下的操作,但是它涉及一些Java编译,如果您希望用Python来完成用例,我认为这应该不是问题-
就Python而言,据我所知,这不可能直接实现根据您的用例要求在单个作业中从最终输出中跳过文件名。但是,下面显示的内容可以轻松实现!
这是需要编译的Java类-
package com.custom; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat; public class CustomMultiOutputFormat extends MultipleTextOutputFormat<Text, Text> { @Override protected String generateFileNameForKeyValue(Text key, Text value, String leaf) { return new Path(key.toString(), leaf).toString(); } @Override protected Text generateActualKey(Text key, Text value) { return null; } }编译步骤:
- 完全将文本保存到文件(没有其他名称) CustomMultiOutputFormat.java
- 当您在上面保存的文件所在的目录中时,键入-
$JAVA_HOME/bin/javac -cp $(hadoop classpath) -d .CustomMultiOutputFormat.java
尝试执行上述命令之前,请确保将JAVA_HOME设置为/ path / to / your / SUNJDK。
使用(精确键入)制作您的custom.jar文件-
$JAVA_HOME/bin/jar cvf custom.jar com/custom/CustomMultiOutputFormat.class
- 最后,像这样运行您的工作-
hadoop jar /path/to/your/hadoop-streaming-*.jar -libjars custom.jar-outputformat com.custom.CustomMultiOutputFormat -file your_script.py -inputinputpath --numReduceTasks 0 -output outputpath -mapper your_script.py
完成这些操作后,您应该在 输出路径中 看到两个目录,一个目录带有 有效文件名 ,另一个目录具有 err_file_name
。所有具有有效文件名作为标记的记录都将进入valid_file_name目录,而所有具有err_file_name的记录将进入err_file_name目录。
我希望所有这些都是有道理的。



