您可以执行以下操作,但它涉及一些 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;
}
}
编译步骤:
- 将文本完全保存到文件(没有不同的名称)
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 -input inputpath --numReduceTasks 0 -output outputpath -mapper your_script.py
完成这些之后,您应该会在输出路径中看到两个目录,一个带有valid_file_name,另一个带有err_file_name。所有以 valid_file_name 作为标签的记录都将进入 valid_file_name 目录,所有具有 err_file_name 的记录将进入 err_file_name 目录。
我希望所有这些都有意义。