您可以执行类似以下的操作,但是它涉及一些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> {
/**
* 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();
}
/**
* We discard the key as per your requirement
*/
@Override
protected Text generateActualKey(Text key, Text value) {
return null;
}
}
$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 -input inputpath --numReduceTasks 0 -output outputpath -mapper your_script.py
完成这些操作后,您应该在 看到两个目录,一个目录带有 ,另一个目录具有 。所有具有有效文件名作为标记的记录都将进入valid_file_name目录,而所有具有err_file_name的记录将进入err_file_name目录。
我希望所有这些都是有道理的。