zoukankan      html  css  js  c++  java
  • KeyValueTextInputFormat 案例

    一、需求分析

    1、文件

    hadoop is ok
    hadoop not ok
    java is fun
    php is ok
    php is pretty
    python is all

    2、需求

    统计输入文件中每一行的第一个单词相同的行数

    3、分析

    每一行第一个单词的数量,只能用KeyValueTextInputFormat

    key value 的分割符为空格

    二、代码

    前提条件:创建maven项目,导入依赖,配置log文件

    1、Mapper

    package com.kv;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    
    public class KVMapper extends Mapper<Text, Text, Text, IntWritable> {
        /*
        分析: 
            切割符,切割后,第一个是 key,后面的是 value 都是Text类型
         */
        IntWritable v = new IntWritable(1);
        @Override
        protected void map(Text key, Text value, Context context) throws IOException, InterruptedException {
            // 写入
            context.write(key, v);
        }
    }

    2、Reducer

    package com.kv;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    public class KVReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
        IntWritable v = new IntWritable();
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable value : values) {
                sum += value.get();
            }
            v.set(sum);
            context.write(key, v);
        }
    }

    3、Driver

    package com.kv;
    
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.KeyValueLineRecordReader;
    import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    import java.io.IOException;
    
    public class KVDriver {
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            args = new String[]{"E:\a\input", "E:\a\output"};
            // 1. 获取job
            Configuration conf = new Configuration();
            // a、设置切割符
            conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, " ");
            Job job = Job.getInstance(conf);
            // 2. 设置 jar
            job.setJarByClass(KVDriver.class);
            // 3. 关联 mapper 和 reducer 类
            job.setMapperClass(KVMapper.class);
            job.setReducerClass(KVReducer.class);
            // 4. 设置 mapper 输出 的 k v 类型
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            // 5. 设置 输出结果的 k v
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            // b、设置输入格式
            job.setInputFormatClass(KeyValueTextInputFormat.class);
            // 6. 设置 输入 输出 路径
            FileInputFormat.setInputPaths(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            // 7. 提交job
            boolean wait = job.waitForCompletion(true);
            System.exit(wait? 0: 1);
        }
    }

    注意:

    设置切割符

    conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, " ");

    设置InputFormat的的格式

    job.setInputFormatClass(KeyValueTextInputFormat.class);
  • 相关阅读:
    【转】sublime text 2 中文乱码解决办法
    vi使用入门指南
    【原创】基于部署映像服务和管理(DISM)修改映象解决WIN7 USB3.0安装时报错
    日语五十音图快速记忆法
    深度阅读:C语言指针,从底层原理到花式技巧,图文+代码透析
    全民热衷“合成大西瓜”,游戏外挂上热搜,不愧是程序员!
    零基础想要转行成为程序员?这几点你要知道
    恩怨纠缠的苹果和微信!苹果底层开源代码中包含兼容微信的代码,这是苹果偷学代码啦?
    好你个C语言,原来还有这么多副面孔!
    “熊孩子”乱敲键盘就攻破了Linux桌面,其父亲发现linux漏洞
  • 原文地址:https://www.cnblogs.com/wt7018/p/13612534.html
Copyright © 2011-2022 走看看