菜单

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

2018年11月18日 - Java

MapReduce简介

Ubuntu14.04

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

叫一定一个文书,统计中单词出现的次数

MapReduce的规律图

 

  1. MR执行之流程

方法1

图片 1

# solution 1

             2.MR原理图

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

 
  
图片 2

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])}
}'

 

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

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

  

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

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();
        }
    }
}

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

补给说明:

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

参数说明:

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

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

Shuffle:将平的k排列一起

 \b     backspace   printf参数

Reduce:将一如既往之k的v相加

awk说明

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

pattern可以是

BEGIN;  END;  expression;    expression , expression;

可执行 for ( var in array ) statement

1.BEGIN模块:这个模块包括了一个操作块(也尽管是”{
}”内的内容)。该操作块是于文书输入之前实施的,

呢便是免待输入外文件数量,也能够尽该模块。

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

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

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

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

匹配表达式:

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

 grep -E
“\b[[:alpha:]]+\b” move.sh 
匹配到 move.sh 中具有的单词
 grep -E
-o “\b[[:alpha:]]+\b” move.sh 
拿匹配到的只词每行1单打印出来
 “\b[[:alpha:]]+\b” 
会配合到周单词

 

方法2

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

# solution 2

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)}'

普通,awk逐行处理公事。awk每接收文件的如出一辙履行,然后实施相应的通令来处理。
因此legal文件来做示范

$ 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

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

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)}'

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

相关文章

标签:

发表评论

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

网站地图xml地图