自定义OutputFormat

自定义一个OutputFormat,用于输出<Text , MapWritable >格式的数据

MapWritable的内容是 [Text : LongWritable ]

输出格式 [url     url2 :times2 ,url3 :times3 ,...]

 

参考TextOutputFormat,修改简化之

 

public class TextAndMapWritableOutputFormat extends
		FileOutputFormat<Text, MapWritable> {

	@Override
	public RecordWriter<Text, MapWritable> getRecordWriter(FileSystem ignored,
			JobConf job, String name, Progressable progress) throws IOException {
		Path file = FileOutputFormat.getTaskOutputPath(job, name);
		FileSystem fs = file.getFileSystem(job);
		FSDataOutputStream fileOut = fs.create(file, progress);

		return new TextAndMapWritableRecordWriter(fileOut);
	}

	protected static class TextAndMapWritableRecordWriter implements RecordWriter<Text, MapWritable> {

		private static final String utf8 = "UTF-8";
		private static final byte[] newline;
		private static final byte[] keyValueSeparator;
		private static final byte[] colon;
		private static final byte[] comma;
		static {
			try {
				newline = "\n".getBytes(utf8);
				keyValueSeparator = "\t".getBytes(utf8);
				colon = ":".getBytes(utf8);
				comma = ",".getBytes(utf8);
			} catch (UnsupportedEncodingException uee) {
				throw new IllegalArgumentException("can't find " + utf8
						+ " encoding");
			}
		}

		protected DataOutputStream out;

		public TextAndMapWritableRecordWriter(DataOutputStream out) {
			this.out = out;
		}

		@Override
		public synchronized void write(Text key, MapWritable value)
				throws IOException {
			out.write(key.getBytes(), 0, key.getLength());
			out.write(keyValueSeparator);

			Iterator<Writable> it = value.keySet().iterator();
			while (it.hasNext()) {
				Writable k = it.next();
				LongWritable v = (LongWritable) value.get(k);

				out.write(((Text) k).getBytes());
				out.write(colon);
				out.write(v.toString().getBytes(utf8));
				out.write(comma);
			}

			out.write(newline);
		}

		@Override
		public synchronized void close(Reporter reporter) throws IOException {
			out.close();
		}

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值