自定义输出文件名

<p>package selfname;</p>
	import java.io.IOException;

	import org.apache.hadoop.conf.Configuration;
	import org.apache.hadoop.fs.Path;
	import org.apache.hadoop.io.Text;
	//import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
	//import org.apache.hadoop.mapreduce.lib.input.MultipleTextOutputFormat;
	import org.apache.hadoop.mapreduce.Job;
	import org.apache.hadoop.mapreduce.Mapper;
	import org.apache.hadoop.mapreduce.Reducer;
	import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
	import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
	import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;

	public class Selfname {
	        public static class FileMap extends Mapper<Object,Text,Text,Text>{
	        	public void map(Object key,Text value,Context context) throws IOException, InterruptedException{
	        		String line = value.toString();
	        		if(line.length()>=93){
	        		String keys = line.substring(15, 19);
	        		String values = line.substring(87,93);
	        		context.write(new Text(keys), new Text(values));
	        		}
	        	}
	        }
	        public static class FileReduce extends Reducer<Text,Text,Text,Text>{
	        	<strong>private MultipleOutputs<Text, Text> multipleOutputs;
	        	protected void setup(Context context)throws IOException, InterruptedException {
	        		multipleOutputs = new MultipleOutputs<Text, Text>(context);
	        		}</strong>
	        	public void reduce(Text key,Iterable<Text>values,Context context) throws IOException, InterruptedException{
	        		String value = new String();
	        		for(Text val:values){
	        			value+=val.toString()+",";
	        		}
	        		<strong>multipleOutputs.write(key, new Text(value), key.toString());</strong>

	        	}
	        	<strong>protected void cleanup(Context context)throws IOException, InterruptedException {
	        		multipleOutputs.close();
	        		}</strong>
	        }
	        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
	        	Configuration conf = new Configuration();
	        	Job job = new Job(conf,"myfile");
	        	job.setJarByClass(Selfname.class);
	        	job.setMapperClass(FileMap.class);
	        	job.setReducerClass(FileReduce.class);
	        	job.setOutputKeyClass(Text.class);
	        	job.setOutputValueClass(Text.class);
	        	job.setNumReduceTasks(1);
	        	FileInputFormat.addInputPath(job, new Path(args[0]));
	        	FileOutputFormat.setOutputPath(job, new Path(args[1]));
	        	System.exit(job.waitForCompletion(true)?0:1);

	        }
	}

上面的代码实现了自定义的输出文件名,关键部分由粗体字标出。

使用MultipleOutputs类动态的实现输出文件的命名,动态,灵活。可以满足用户的定制需求,而且相对与其他的方法其代码量也非常少。

这里我用的数据是权威指南上边的气象数据,将相同年份的气温存储到一个文件中。

<strong>private MultipleOutputs<Text, Text> multipleOutputs;</strong>
<strong>声明一个MultipleOutputs变量。</strong>
<strong></strong><pre name="code" class="java"><strong>protected void setup(Context context)throws IOException, InterruptedException {
	        		multipleOutputs = new MultipleOutputs<Text, Text>(context);
	        		}</strong>

创建一个MultipleOutput变量。


<strong></strong><pre name="code" class="java"><strong>multipleOutputs.write(key, new Text(value), key.toString());</strong>

输出文件,类似于context.write。第一个变量为key,第二个变量为value,第三个变量为输出文件路径名。


<strong>最后需要使用cleanup函数将这个对象关闭。</strong>
<strong>
</strong>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 05:52:20

自定义输出文件名的相关文章

hadoop编程小技巧(7)---自定义输出文件格式以及输出到不同目录

代码测试环境:Hadoop2.4 应用场景:当需要定制输出数据格式时可以采用此技巧,包括定制输出数据的展现形式,输出路径,输出文件名称等. Hadoop内置的输出文件格式有: 1)FileOutputFormat<K,V>  常用的父类: 2)TextOutputFormat<K,V> 默认输出字符串输出格式: 3)SequenceFileOutputFormat<K,V> 序列化文件输出: 4)MultipleOutputs<K,V> 可以把输出数据输送到

IOS利用宏自定义输出(NSLog)

前言: 1)输出日志是会大量损耗系统性能 2)输出的信息很容易会被截取到,导致信息不安全. 所以我们会在发行版(Release)取消所有的Log.如果一行一行地去注释掉Log,显然不是一个明确的选择. 因此我们可以使用宏去自定义Log输出. 最简单的一个例子: #ifdef DEBUG # define GCLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__); #else # define GCLog(...); #endif 使用方法: GCLog(@"sdf&

Gradle实现自动打包,签名,自定义apk文件名

Gradle实现自动打包,签名,自定义apk文件名 什么是签名,签名有什么用 Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行时到手机上时,是AS会自动用默认的密钥和证书来进行签名:但是我们实际发布编译时,则不会自动签名,这个时候我们就需要进行手动签名了!为我们的APK签名有以下好处: 1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应

SAP中自定义输出字段的ALV实例

这是运行的结果.对于我们的数据表我们需要字段可以自定义以ALV的格式输出. 特别注意点:wa_alv_field-fieldname = 'EMPID'.这个地方 EMPID一定要大写否则会在运行时报错. *&---------------------------------------------------------------------* *& Report  ZTBALV1 *& *&---------------------------------------

Lrc2srt精灵,增加自定义输出编码

2015.4.8 对中文支持有点问题,修改了一下,支持自定义输出编码! 修改了建议行末偏移,通常100到200最好了,人的反应时间! http://files.cnblogs.com/files/rovedog/Lrc2Srt.2015.4.12.zip

phpcms v9自定义HTML文件名

用过织梦.Wordpress.Zblog等程序的网友都知道,发布内容的时候可以自定义生成的HTML文件名,这个功能对于SEO来说非常有好 处,但是到了V9之后却很遗憾, 这个功能却没有了,现在你只要对V9进行一个小小的修改即可令V9拥有自定义HTML文件名的功能,操作方法如下: 1.修改你需要设置的模型,添加一个字段,配置如下: 2.打开/phpcms/modules/content/create_html.php,找到代码: $urls = $this->url->show($r['id']

织梦图集图片在首页列表页调用并且自定义输出几张

不改动官方核心文件,在自定义方法文件里加入个方法来实现织梦图集图片在首页列表页调用并且自定义输出几张 效果展示 教程实现 打开 include\extend.func.php 在最下面加入这个方法 function Getimgurls($aid,$num=4) { global $dsql; $imgurls = $result = ''; $imgrow = $dsql->GetOne( "Select imgurls From `#@_addonimages` where aid='

dedecms:自定义文章文件名生成目录形式的方法

在DEDECMS中,发布文章时可以自定义文件名,生成譬如:xxx.com/a/zidingyi.html 的URL文件 然而如果想将文章生成为目录形式呢?譬如:xxx.com/a/zidingyi/index.html 只需要简单一步即可搞定. 涉及文件: include/helpers/channelunit.helper.php  189行 $articleRule = dirname($articleRule).'/'.$filename.$GLOBALS['cfg_df_ext']; 改

log4j2自定义输出线程环境信息

在配置日志的输出格式的时候,我们可以按照内置的规则输出日志,但是有时候需要及时输出我们自定义的信息,这时需要借助ThreadContext类. ThreadContext类类似于MDC和NDC,它是一种线程上下文环境,它有两种方法可以实现加入数据到线程环境中,一种是push(param),一种是put(key , value).第一种方法是以一种堆栈的方式存放信息的,在存入信息后,要以pop()方法将信息弹出,以存入下一个信息,示例代码如下: 1 ThreadContext.push("abc&