文档章节

GenericWritable

Zero零_度
 Zero零_度
发布于 2015/01/11 19:43
字数 418
阅读 122
收藏 0

精选30+云产品,助力企业轻松上云!>>>

package com.test;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.GenericWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
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.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * 业务场景:
 * 含有两个文件,两个文件中单词之间的分隔方式不一样,但是统计出单词在两个文件中公共出现的次数

 *
 * 文件来源1,逗号分隔text1.txt
 *  hello,what
 *  you,haha
 * 文件来源2,制表符分隔text2.txt
 * girl boy
 * father mother
 */
public class WordCountGenericWritable extends Configured implements Tool {
 
 public static class Map1 extends Mapper<LongWritable, Text, Text, MyGenericWritable> {
  public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
   String line = value.toString();
   
   StringTokenizer st = new StringTokenizer(line, ",");
   while(st.hasMoreElements()) {
    context.write(new Text(st.nextElement().toString()), new MyGenericWritable(new LongWritable(1)));
   }
  }
 }
 
 public static class Map2 extends Mapper<Text, Text, Text, MyGenericWritable> {
  public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
   context.write(key, new MyGenericWritable(new Text("1")));
   context.write(value, new MyGenericWritable(new Text("1")));
  }
 }
 
 public static class Reduce extends Reducer<Text, MyGenericWritable, Text, IntWritable> {
  public void reduce(Text key, Iterable<MyGenericWritable> values, Context context) throws IOException, InterruptedException {
   int count = 0;
   Iterator<MyGenericWritable> it = values.iterator();
   while(it.hasNext()) {
    MyGenericWritable myGw = it.next();
    Writable value = myGw.get();
    if(value instanceof LongWritable) {
     count = count + Long.valueOf(((LongWritable)value).get()).intValue();
    }
    if(value instanceof Text) {
     count = count + Long.valueOf(((Text)value).toString()).intValue();
    }
   }
   context.write(key, new IntWritable(count));
  }
 }
 
 public int run(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
  Configuration conf = this.getConf();
  Job job = new Job(conf);
  job.setJobName(WordCountGenericWritable.class.getSimpleName());
  job.setJarByClass(WordCountGenericWritable.class);
  
  MultipleInputs.addInputPath(job, new Path("hdfs://grid131:9000/text1.txt"), TextInputFormat.class, Map1.class);
  MultipleInputs.addInputPath(job, new Path("hdfs://grid131:9000/text2.txt"), KeyValueTextInputFormat.class, Map2.class);

  
  FileOutputFormat.setOutputPath(job, new Path(args[1]));
  job.setReducerClass(Reduce.class);
  
  job.setOutputFormatClass(TextOutputFormat.class);
  
  //当map的输出类型和reduce的输出类型不一致的时候,需要单独设置map输出类型
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(MyGenericWritable.class);
  
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);
  
  job.waitForCompletion(true);
  
  return job.isSuccessful()?0:1;
 }
 
 public static void main(String[] args) throws Exception {
  int exit = ToolRunner.run(new WordCount(), args);
  System.exit(exit);
 }
 
}

class MyGenericWritable extends GenericWritable {

 public MyGenericWritable() {
  
 }
 
 public MyGenericWritable(LongWritable longWritable) {
  super.set(longWritable);
 }
 
 public MyGenericWritable(Text text) {
  super.set(text);
 }
 
 @Override
 protected Class<? extends Writable>[] getTypes() {
  return new Class[]{LongWritable.class, Text.class};
 }
 
}

下一篇: NLineInputFormat
Zero零_度
粉丝 70
博文 1325
码字总数 283013
作品 0
程序员
私信 提问
加载中
请先登录后再评论。
hadoop深入研究:(十一)——序列化与Writable实现

转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/9249411 所有源码在github上,https://github.com/lastsweetop/styhadoop 简介 在hadoop中,Writable的实现类是个庞......

lastsweetop
2013/07/17
0
0
hadoop学习笔记(十一):MapReduce数据类型

一、序列化 1 hadoop自定义了数据类型,在hadoop中,所有的key/value类型必须实现Writable接口。有两个方法,一个是write,一个是readFileds。分别用于读(反序列化操作)和写(序列化操作)...

osc_lsc01x8k
2018/04/28
4
0
Hadoop Outline - Part 2 (I/O - Writable)

Hadoop I/O Data Integrity Hdfs: % hadoop fs -cat hdfs://namenode/data/a.txt LocalFS: % hadoop fs -cat file:///tmp/a.txt generate crc check sum file %hadoop fs -copyToLocal -crc ......

woodo
2014/08/28
53
0
Hadoop文件的序列化

为什么要序列化   如图,一个活着的对象只存在于内存中,一旦断电就会消失。并且,在正常情况下,一个或者的对象无法直接通过网络发送到其他(远程)机器上。而序列化可以克服上述问题,它...

osc_6ddefhon
2018/03/28
2
0

没有更多内容

加载失败,请刷新页面

加载更多

没有更多内容

【题解】p6160 [Cnoi2020]向量

原题传送门 序 啊又是勤奋学习的一天...... 这种mo题目能做出来纯靠感觉。 样例分析 样例输入给了组3、4、5的勾股数,而输出正好是三向量加和为0时的答案。 嗯我好像感觉到了什么...... 于是...

osc_4dady4pk
50分钟前
13
0
【题解】p6160 [Cnoi2020]向量

原题传送门 序 啊又是勤奋学习的一天...... 这种mo题目能做出来纯靠感觉。 样例分析 样例输入给了组3、4、5的勾股数,而输出正好是三向量加和为0时的答案。 嗯我好像感觉到了什么...... 于是...

osc_a7a1prn6
52分钟前
13
0
FreeSql (一)入门

FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。(QQ群:4336577) 模型 FreeSql 使用模型执行数据访问,模...

osc_smzoc82r
53分钟前
18
0
TCP协议粘包问题详解

TCP协议粘包问题详解 前言   在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产...

osc_tjnx25e9
55分钟前
29
0
Ubuntu16.04密码正确 进不去桌面系统(已测试恢复正常)

遇到过两次ubuntu输入密码正确,但是进不去系统,输入密码后,跳转到一下界面 之后又返回到登陆界面,一直这样循环输入密码。 Guest用户可以。 解决办法:   1。进入tty下 :ctrl+alt+F1(F...

osc_lfbryx1h
56分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部