(004)Hadoop基础的WordCount(统计文本单词次数)

Reduce:将同的k的v相加

###########################

package com.lj.MR;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;

import java.io.IOException;

public class WCReducce extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //super.reduce(key, values, context);
        int count = 0;
        for(IntWritable iw:values){
             count = count + iw.get();
        }
        context.write(key,new IntWritable(count));
    }
}

package com.lj.MR;

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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.log4j.BasicConfigurator;


public class WCApp {
    public static void main(String[] args) {
        BasicConfigurator.configure();

        Configuration conf = new Configuration();
        //此处为本地测试
        // conf.set("fs.defaultFS","file:///D://ItTools");
        try {
            //单例模式
            Job job = Job.getInstance(conf);
            //任务作业名字
            job.setJobName("WCApp");
            //搜索类
            job.setJarByClass(WCApp.class);
            //设置输入格式
            job.setInputFormatClass(TextInputFormat.class);


            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));


            job.setMapperClass(WCMapper.class);
            job.setReducerClass(WCReducce.class);


            job.setNumReduceTasks(1);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);

            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            job.waitForCompletion(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ubuntu14.04

 
  
图片 1

2.
END模块:与BEGIN模块相反,是处理终结文件后的操作。不配合任何输入行,常用来出口一些总信息。

 

方法1

MapReduce简介

eg: awk
‘BEGIN{print “Hello World! Begin
doing!”}’
#输出字符串 

             2.MR原理图

# 先判断输入是否是,如果输入大于1独公文,用第一个文件

MAP:就是用本来文字转换成为(k,v),其中k就是word,v就是单词的面世的次数

增补说明:

  • 代码简单解析:

BEGIN模块常用来安装修改内置变量如(OFS,RS,FS等),为用户从定义之变量赋初始值或者打印标题信息相当。

  

末段之awk调换了单词和数字的位置
统计 /etc/legal 中单词出现次数,并因为“单词
次数”格式输出结果

因实施流程图我们好发现,首先我们打Mapper下手,然后在手Reducer,而Reducer的key(in),value(in),肯定是Mapper的key(out),value(out),否则我们好窥见,一定会类型不配合,直接报错。

# solution 1

  1. MapReduce是一致种分布式计算模型,主要解决海量数据的计问题。
  2. MR有有限个等级做:Map和Reduce,用户仅待兑现map()和reduce()两独函数,即可实现分布式计算。

BEGIN;  END;  expression;    expression , expression;

MapReduce的原理图

grep与awk配合使用,写成一个sh脚本 fre.sh 

  • 依据代码简单询问MR。

    package com.lj.MR;

    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    import java.io.IOException;

    public class WCMapper extends Mapper {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //super.map(key, value, context);
        String[] arr = value.toString().split(" ");
        Text keyOut = new Text();
        IntWritable valueOut = new IntWritable();
        for(String s :arr){
            keyOut.set(s);
            valueOut.set(1);
            try {
                context.write(keyOut,valueOut);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    }

awk说明

  1. MR执行之流程

# solution 2

Shuffle:将平的k排列一起

sh fre.sh wordfretest.txt

#! /bin/bash
# solution 1
if [ $# -eq 0 ]
then
echo "Usage:$0 args error"
exit 0
fi
if [ $# -ge 2 ]
then
echo "analyse the first file $1"
fi

#get the first file
filename=$1
grep -E -o "\b[[:alpha:]]+\b" $filename | awk ' { count[$0]++ } 
END{printf("%-20s%s\n","Word","Count");
for(word in count)
{printf("%-20s%s\n",word,count[word])}
}'

图片 2

得尽 for ( var in array ) statement

一般性,awk逐行处理公事。awk每接收文件之等同实施,然后实施相应的授命来处理。
据此legal文件来开示范

一旦 words.txt 是目标文件,只用一行代码

 

# 用grep把单词提取出来,用awk来统计这些单词;最后打印出

[[:alpha:]]  代表 字母
[[:alnum:]] 代表 字母同数字字符
[a-zA-Z0-9]代表单个字母和数字字符

awk由内容以及动作结合;awk pattern {action}

 \b     backspace   printf参数

让一定一个文本,统计中单词出现的次数

配合表达式:

参数说明:

 grep -E
“\b[[:alpha:]]+\b” move.sh 
相当到 move.sh 中有的单词
 grep -E
-o “\b[[:alpha:]]+\b” move.sh 
将匹配到之独自词每行1独打印出来
 “\b[[:alpha:]]+\b” 
克配合到全部单词

awk -F' ' '{for(i=1;i<=NF;i=i+1){print $i}}' /etc/legal |
sort|uniq -c|sort -nr|awk -F' ' '{printf("%s %s\n",$2,$1)}'

1.BEGIN模块:这个模块包括了一个操作块(也不怕是”{
}”内之始末)。该操作块是在文件输入之前实施之,

呢便是免待输入任何公文数量,也能够实行该模块。

$ cat /etc/legal 
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

# 搜索统计单词“law”的个数
$ awk -F : '/law/{count++} END{print "the count is ",count}' /etc/legal
the count is 1
# 统计单词“the”的个数
$ awk -F : '/the/{count++} END{print "the count is ",count}' /etc/legal 
the count is 3

pattern可以是

 

awk -F' ' '{for(i=1;i<=NF;i=i+1){print $i}}' words.txt |sort|uniq -c|sort -nr|awk -F' ' '{printf("%s %s\n",$2,$1)}'

找到指定单词,自定义变量count自增,最后输出语句和count值
命令sort,把各行按首字母排列顺序重新排列起来
sort -nr,每行都因为数字开头,按数字从高达多少,排列各行
uniq -c,统计各行出现的次数,并把次数打印在每行前端
awk参数 NF – 浏览记录之地面的个数
汇总起来,命令就是

BEGIN模块中之口舌操作以“;”标志或分公司隔开。

###########################

方法2

-eq:等于
-ne:不等于
-le:小于等于
-ge:大于等于
-lt:小于
-gt:大于

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图