我创建了一个程序,它处理两个数据文件,一个包含客户数据,另一个包含事务数据,我在此数据文件上应用了reduce连接并处理了文件和输出之类的 客户名称交易总金额 Amit Kumar 4 120000000 Kawaldeep Sing 5 20000000 Sanosh singh 6 10000000
现在我希望当每个名称的程序运行输出进入seprate文件时,如果一行包含有关Amit Kumar的数据,那么这些数据将进入名为Amit的文件,类似于其他记录。
如果上述情况可能,那么如果作业每5分钟运行一次,那么我们如何将输出附加到同一个文件。
请帮我解决这个问题。
谢谢&看待 阿米特
答案 0 :(得分:0)
让Amit,Kawaldeep等名称成为地图制作者的关键输出。因此,reducer处理一个键映射器输出的整个数据,并使reducer输出也是同一个键。我们可以覆盖MultipleTextOutputFormat类,为每个键提供单独的输出文件。以下代码可能有用。
/**
* Create output files based on the output record's key name.
*/
static class KeyBasedMultipleTextOutputFormat
extends MultipleTextOutputFormat<Text, Text> {
@Override
protected String generateFileNameForKeyValue(Text key, Text value, String name) {
return key.toString() + "/" + name;
}
}
在工作班中
jobConf.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);
答案 1 :(得分:0)
寻找:
org.apache.hadoop.mapreduce.lib.output.MultipleOutputs
用于追加文件: merge output files after reduce phase
希望它有用。